我可以知道如何在不使用MATLAB中的for循环的情况下替换特定矩阵位置的值吗?我初始化矩阵a
,我想在每个no
的指定行和列上替换它的值。这必须在num
for循环内完成几次。 num
for循环在这里很重要,因为我希望更新原始代码中的值。
真正的代码更复杂,我正在简化这个问题的代码。
我的代码如下:
a = zeros(2,10,15);
for num = 1:10
b = [2 2 1 1 2 2 2 1 2 2 2 2 1 2 2];
c = [8.0268 5.5218 2.9893 5.7105 7.5969 7.5825 7.0740 4.6471 ...
6.3481 14.7424 13.5594 10.6562 7.3160 -4.4648 30.6280];
d = [1 1 1 2 1 1 1 1 1 1 3 1 6 1 1];
for no = 1:15
a(b(no),d(no),no) = c(1,no,:)
end
end
示例输出,例如no 13,如下所示:
a(:,:,13) =
Columns 1 through 8
0 0 0 0 0 7.3160 0 0
0 0 0 0 0 0 0 0
Columns 9 through 10
0 0
0 0
非常感谢你提供的任何帮助。
答案 0 :(得分:5)
可以使用sub2ind
来完成,它将subs转换为线性索引。
按照模糊的变量名称,它看起来像这样(省略num
上的无用循环):
a = zeros(2,10,15);
b = [2 2 1 1 2 2 2 1 2 2 2 2 1 2 2];
d = [1 1 1 2 1 1 1 1 1 1 3 1 6 1 1];
c = [8.0268 5.5218 2.9893 5.7105 7.5969 7.5825 7.0740 4.6471 ...
6.3481 14.7424 13.5594 10.6562 7.3160 -4.4648 30.6280];
% // we vectorize the loop over no:
no = 1:15;
a(sub2ind(size(a), b, d, no)) = c;
答案 1 :(得分:4)
除Nras's solution中建议的基于sub2ind
的方法外,如果性能非常关键,您可以使用"raw version" of sub2ind
来减少函数调用。比较sub2ind
及其原始版本的相关基准在another solution中列出。这是解决您案件的实施 -
no = 1:15
a = zeros(2,10,15);
[m,n,r] = size(a)
a((no-1)*m*n + (d-1)*m + b) = c
同样对于预分配,您可以使用Undocumented MATLAB blog post on Preallocation performance
中列出的更快的方法 -
a(2,10,15) = 0;
答案 2 :(得分:1)
函数sub2ind
是你的朋友:
a = zeros(2,10,15);
x = [2 2 1 1 2 2 2 1 2 2 2 2 1 2 2];
y = [1 1 1 2 1 1 1 1 1 1 3 1 6 1 1];
z = 1:15;
dat = [8.0268 5.5218 2.9893 5.7105 7.5969 7.5825 7.0740 4.6471 ...
6.3481 14.7424 13.5594 10.6562 7.3160 -4.4648 30.6280];
inds = sub2ind(size(a), x, y, z);
a(inds) = dat;
答案 3 :(得分:1)
Matlab提供了一个功能&sub'ind2'可能会做你所期望的。
与您发布的变量相同:
idx = sub2ind(size(a),b,d,[1:15]); % return the index of row a column b and page [1:15]
a(idx) = c;