让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???
也许还有其他解决方案(没有额外的循环)?
答案 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);