获取arrayfun中二维矩阵的当前元素的索引

时间:2013-09-03 15:48:18

标签: matlab matrix vectorization

M为某个矩阵:

M = rand(1000, 2000);

请考虑以下代码示例:

A = zeros(size(M));
for row = 1:1000
    for col = 1:2000
        A(row, col) = M(row,col)*(row + col);
    end
end

如何计算没有A循环的矩阵for

arrayfun函数,但我不知道如何得到当前元素的索引:

A = arrayfun(@(x)(x*(index(1) + index(2))), M); %// but how to get index???

也许还有其他解决方案(没有额外的循环)?

3 个答案:

答案 0 :(得分:3)

您可以执行以下简单操作,以获取代表row+col的矩阵,然后将其乘以M

M = rand(1000, 2000);
rowPlusCol = bsxfun(@plus,(1:size(M,1)).',1:size(M,2));
A = M.*rowPlusCol;

根据我的经验bsxfun是一个非常强大的功能,绝对可以节省一些运行时间,这是一个很好的例子。

答案 1 :(得分:2)

这是一个替代解决方案,为了多样性而拥有另一个花哨的单行:

A = M .* hankel(2:size(M, 1) + 1, size(M, 1) + 1:sum(size(M)));

答案 2 :(得分:1)

我认为arrayfun无法实现。

您可以使用meshgrid获取行号和列号,然后进行一些简单的矩阵数学运算。

M = rand(1000, 2000);
[cols,rows] = meshgrid(1:size(M,2), 1:size(M,1));
A = M .* (cols + rows);