在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循环中获得相同的结果?
答案 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) ];