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
调用中检查变量名。。。。特别是在每句话的结尾。