Matlab:用特定条件替换矩阵中的值
Matlab: replace value in a matrix with specific conditions
我想根据以下内容替换矩阵 M
中 1
的一些值:
M 是一个仅包含值 0
、1
和 2
:
的矩阵
M = [2 0 1 0 1 2 0 0 0 0
1 0 0 2 0 0 0 1 0 0
0 1 0 0 2 0 2 1 0 0
0 1 1 2 0 0 0 0 1 0
0 0 1 0 0 0 0 0 1 1]
max=( 2 1 1 2 2 2 2 1 1 1 )
max 是每列的最大值。
我只对矩阵 M
的列感兴趣,其 max
是 1
对于具有 max = 1
的给定列,我连续考虑该列的一个值 1
;我只考虑同一行上存在值 2
的值 1
。
因此,对于给定值 1
,我检查同一列上是否有另一个值 1
,其行不包含任何 2
。如果是这样,我将第一个 1
替换为 5
。如果不是,我将 1
替换为 -5
示例:
max(3)=1
M(1,3)=1, M(4,3)=1
和 M(5,3)=1
。
这里,对于第三列,我只考虑M(1,3)=1
和M(4,3)=1
。对于M(5,3)=1
,第5行没有2
。
因此,对于 M(1,3)=1(对于 M(4,3)=1 也是如此)我检查同一列上是否有另一个值 1
,其行不包含任何2
!在这种情况下,M(5,3)=1
满足 M(1,3)=1
和 M(4,3)=1
的条件。我将 1
替换为 5
,我将得到 M(1,3)=5
和 M(4,3)=5
当 max(k)=1
.
时,我对其他列执行相同的操作
最后我想得到的结果是:
M = [2 0 5 0 1 2 0 0 0 0
1 0 0 2 0 0 0 -5 0 0
0 -5 0 0 2 0 2 -5 0 0
0 -5 5 2 0 0 0 0 5 0
0 0 1 0 0 0 0 0 1 1]
试试这个:
maxM=max(M) % never give a variable name of function (like just 'max')
MM=M(:,maxM==1);
maxM2=max(M,[],2);
rows2=MM(maxM2==2,:)*5;
rows1=MM(maxM2~=2,:);
rows2(:,~sum(rows1,1))=-rows2(:,~sum(rows1,1));
MM(maxM2==2,:)=rows2;
M(:,maxM==1)=MM;
M = [2 0 1 0 1 2 0 0 0 0
1 0 0 2 0 0 0 1 0 0
0 1 0 0 2 0 2 1 0 0
0 1 1 2 0 0 0 0 1 0
0 0 1 0 0 0 0 0 1 1];
max_C = max(M,[],1);
max_R = max(M,[],2);
q = size(M,2);
for i=1:q
if max_C(i)==1
One_index = find(ismember(M(:,i),1));
p1 = size(One_index,1);
x=0;
for j=1:p1
if max_R(One_index(j))==1
x=x+1;
end
end
if x>0
for j=1:p1
if max_R(One_index(j))==2
M(One_index(j),i)=5;
end
end
else
for j=1:p1
if max_R(One_index(j))==2
M(One_index(j),i)=-5;
end
end
end
end
end
我想根据以下内容替换矩阵 M
中 1
的一些值:
M 是一个仅包含值 0
、1
和 2
:
M = [2 0 1 0 1 2 0 0 0 0
1 0 0 2 0 0 0 1 0 0
0 1 0 0 2 0 2 1 0 0
0 1 1 2 0 0 0 0 1 0
0 0 1 0 0 0 0 0 1 1]
max=( 2 1 1 2 2 2 2 1 1 1 )
max 是每列的最大值。
我只对矩阵 M
的列感兴趣,其 max
是 1
对于具有 max = 1
的给定列,我连续考虑该列的一个值 1
;我只考虑同一行上存在值 2
的值 1
。
因此,对于给定值 1
,我检查同一列上是否有另一个值 1
,其行不包含任何 2
。如果是这样,我将第一个 1
替换为 5
。如果不是,我将 1
替换为 -5
示例:
max(3)=1
M(1,3)=1, M(4,3)=1
和 M(5,3)=1
。
这里,对于第三列,我只考虑M(1,3)=1
和M(4,3)=1
。对于M(5,3)=1
,第5行没有2
。
因此,对于 M(1,3)=1(对于 M(4,3)=1 也是如此)我检查同一列上是否有另一个值 1
,其行不包含任何2
!在这种情况下,M(5,3)=1
满足 M(1,3)=1
和 M(4,3)=1
的条件。我将 1
替换为 5
,我将得到 M(1,3)=5
和 M(4,3)=5
当 max(k)=1
.
最后我想得到的结果是:
M = [2 0 5 0 1 2 0 0 0 0
1 0 0 2 0 0 0 -5 0 0
0 -5 0 0 2 0 2 -5 0 0
0 -5 5 2 0 0 0 0 5 0
0 0 1 0 0 0 0 0 1 1]
试试这个:
maxM=max(M) % never give a variable name of function (like just 'max')
MM=M(:,maxM==1);
maxM2=max(M,[],2);
rows2=MM(maxM2==2,:)*5;
rows1=MM(maxM2~=2,:);
rows2(:,~sum(rows1,1))=-rows2(:,~sum(rows1,1));
MM(maxM2==2,:)=rows2;
M(:,maxM==1)=MM;
M = [2 0 1 0 1 2 0 0 0 0
1 0 0 2 0 0 0 1 0 0
0 1 0 0 2 0 2 1 0 0
0 1 1 2 0 0 0 0 1 0
0 0 1 0 0 0 0 0 1 1];
max_C = max(M,[],1);
max_R = max(M,[],2);
q = size(M,2);
for i=1:q
if max_C(i)==1
One_index = find(ismember(M(:,i),1));
p1 = size(One_index,1);
x=0;
for j=1:p1
if max_R(One_index(j))==1
x=x+1;
end
end
if x>0
for j=1:p1
if max_R(One_index(j))==2
M(One_index(j),i)=5;
end
end
else
for j=1:p1
if max_R(One_index(j))==2
M(One_index(j),i)=-5;
end
end
end
end
end