3

让我们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???

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

4

3 回答 3

3

您可以执行如下简单的操作来获取一个矩阵,该矩阵将表示row+col然后将其乘以 M

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

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

于 2013-09-03T15:56:23.140 回答
2

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

A = M .* hankel(2:size(M, 1) + 1, size(M, 1) + 1:sum(size(M)));
于 2013-09-03T16:14:34.897 回答
1

我不认为这是可能的arrayfun

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

M = rand(1000, 2000);
[cols,rows] = meshgrid(1:size(M,2), 1:size(M,1));
A = M .* (cols + rows);
于 2013-09-03T16:01:15.030 回答