用数组值替换特定的矩阵位置,而不在MATLAB中使用for循环

时间:2015-03-09 13:01:54

标签: matlab matrix

我可以知道如何在不使用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

非常感谢你提供的任何帮助。

4 个答案:

答案 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;