Matlab:使用矩阵运算代替for循环

时间:2013-12-04 23:37:57

标签: matlab for-loop matrix indexing

在Matlab中是否可以仅使用矩阵运算来创建NxN矩阵Mat,就像下面两个foor循环一样?

Mat = zeros(N);
for row = 1:N
    for col = 1:N
        if (row == 1 && (1 <= col && col <= N))
            Mat(row,col) = N;
        end
        if ((2 <= row && row <= N) && (1 <= col && col <= N))
            Mat(row,col) = (2*row+1)*col;
        end
    end
end

我认为索引相应的行和列如:

Mat(1,1:N) = N;

row = 2:N;
col = 1:N;
Mat(row,col) = (2.*row+1).*col;

第一行正在运作。 但是第二个操作显然导致了行和列的尺寸问题。

如何使用row和col的每个值? 或者是否有一种更简单的方法可以从两个foor循环中获得相同的结果?

3 个答案:

答案 0 :(得分:3)

对于第一个if语句(if (row == 1 && (1 <= col && col <= N))),你实际上是在说“将第一行中的每个元素都设置为N”。这可以通过以下方式轻松实现:

Mat(1,:) = N;

括号中的第一个参数告诉matlab选择第一行,第二个参数告诉它选择该行中的每个元素。

第二个if语句有点复杂,但仍然可行。现在我们说“对于第一行以外的每一行,将每个元素Mat(row,column)设置为(2 * row + 1)* col”。使用bsxfun

可以轻松完成此操作
row = 2:N;
col = 1:N;
Mat(2:end,:) = bsxfun(@times,2.*row' + 1, col);

答案 1 :(得分:3)

您也可以使用ndgrid;

[II,JJ] = ndgrid(1:N);
Mat = JJ+2*JJ.*II;
Mat(1,:) = N;

答案 2 :(得分:1)

Mat = [ repmat(N,1,N); (2*repmat((2:N).',1,N)+1) .* repmat(1:N,N-1,1) ];