Matlab 基于行数和列数的线性方程修改矩阵的部分
例如:Matlab 基于行数和列数的线性方程修改矩阵的部分,matlab,matrix,indexing,Matlab,Matrix,Indexing,例如: >> tmp = ones(5,5) tmp = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 我需要一个命令,如: tmp(colNum - 2*rowNum > 0) = 0 当列号大于行号的两倍时
>> tmp = ones(5,5)
tmp =
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
我需要一个命令,如:
tmp(colNum - 2*rowNum > 0) = 0
当列号大于行号的两倍时,修改tmp
的条目,例如,它应产生:
tmp =
1 1 0 0 0
1 1 1 1 0
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
作为第二个示例,tmp(colNum-rowNum==0)=0
应该将tmp
的对角线元素设置为零。您可以使用它生成二维坐标的网格,然后使用它施加任何您想要的条件。您搜索的变量输出2个二维矩阵,其中第一个矩阵给出列位置,第二个矩阵输出行位置
例如,鉴于您的上述情况:
>> [X,Y] = meshgrid(1:5, 1:5)
X =
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
Y =
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
您可以看到,在X
和Y
之间共享的每个唯一空间位置都为您提供了所需的二维位置,就像您设想的二维栅格一样
因此,对于第一种情况,您会这样做:
[X,Y] = meshgrid(1:5,1:5); % Generate 2D coordinates
tmp = ones(5); % Generate desired matrix
tmp(X > 2*Y) = 0; % Set desired locations to 0
我们得到:
>> tmp
tmp =
1 1 0 0 0
1 1 1 1 0
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
>> tmp
tmp =
0 1 1 1 1
1 0 1 1 1
1 1 0 1 1
1 1 1 0 1
1 1 1 1 0
最后是第二个示例:
[X,Y] = meshgrid(1:5,1:5); % Generate 2D coordinates
tmp = ones(5); % Generate desired matrix
tmp(X == Y) = 0; % Set desired locations to 0
我们得到:
>> tmp
tmp =
1 1 0 0 0
1 1 1 1 0
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
>> tmp
tmp =
0 1 1 1 1
1 0 1 1 1
1 1 0 1 1
1 1 1 0 1
1 1 1 1 0
简单地说,生成一个二维坐标网格,然后使用逻辑
/Boolean条件直接将这些坐标索引到所需矩阵中,将所需位置设置为0。您可以使用它生成二维坐标网格,然后使用它施加任何您想要的条件。您搜索的变量输出2个二维矩阵,其中第一个矩阵给出列位置,第二个矩阵输出行位置
例如,鉴于您的上述情况:
>> [X,Y] = meshgrid(1:5, 1:5)
X =
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
Y =
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
您可以看到,在X
和Y
之间共享的每个唯一空间位置都为您提供了所需的二维位置,就像您设想的二维栅格一样
因此,对于第一种情况,您会这样做:
[X,Y] = meshgrid(1:5,1:5); % Generate 2D coordinates
tmp = ones(5); % Generate desired matrix
tmp(X > 2*Y) = 0; % Set desired locations to 0
我们得到:
>> tmp
tmp =
1 1 0 0 0
1 1 1 1 0
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
>> tmp
tmp =
0 1 1 1 1
1 0 1 1 1
1 1 0 1 1
1 1 1 0 1
1 1 1 1 0
最后是第二个示例:
[X,Y] = meshgrid(1:5,1:5); % Generate 2D coordinates
tmp = ones(5); % Generate desired matrix
tmp(X == Y) = 0; % Set desired locations to 0
我们得到:
>> tmp
tmp =
1 1 0 0 0
1 1 1 1 0
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
>> tmp
tmp =
0 1 1 1 1
1 0 1 1 1
1 1 0 1 1
1 1 1 0 1
1 1 1 1 0
简单地说,生成一个二维坐标网格,然后使用
逻辑
/Boolean条件直接将这些坐标索引到所需矩阵中,将所需位置设置为0。一个可能更有效的解决方案是像这样使用bsxfun
nRows = 5;
nCols = 5;
bsxfun(@(col,row)~(col - 2*row > 0), 1:nCols, (1:nRows)')
您可以将其推广为只接受一个函数,使其成为
bsxfun(@(col,row)~f(col,row), 1:nCols, (1:nRows)')
现在,用你在问题中指定方程式的方式替换f
,即
f = @(colNum, rowNum)(colNum - 2*rowNum > 0)
或
当然,指定函数接受
(行,列)
而不是(列,行)
可能更有意义,因为这就是MATLAB索引的方式一个可能更有效的解决方案是像这样使用bsxfun
nRows = 5;
nCols = 5;
bsxfun(@(col,row)~(col - 2*row > 0), 1:nCols, (1:nRows)')
您可以将其推广为只接受一个函数,使其成为
bsxfun(@(col,row)~f(col,row), 1:nCols, (1:nRows)')
现在,用你在问题中指定方程式的方式替换f
,即
f = @(colNum, rowNum)(colNum - 2*rowNum > 0)
或
当然,将函数指定为接受
(行,列)
而不是(列,行)
可能更有意义,因为这就是MATLAB索引的方式,根本没有问题。祝你好运没问题。祝你好运您可能需要在bsxfun
调用中检查变量名。。。。特别是在每条语句的末尾。您可能需要在bsxfun
调用中检查变量名。。。。特别是在每句话的结尾。