Matlab 矩阵运算困难

Matlab 矩阵运算困难,matlab,vector,matrix,matrix-multiplication,Matlab,Vector,Matrix,Matrix Multiplication,我无法将向量推回矩阵。考虑到,N×N矩阵称为MyMatrix,其中N=10,由零和非零元素组成,对角线元素均为零。共有2个向量:维度为15的正向量,由从MyMatrix提取的10个非零元素组成,以及ConceptsVector分别由N元素组成。假设向量由以下元素组成 Positive_Vector=[MyMatrix(1,2)、MyMatrix(1,6)、MyMatrix(2,5)、MyMatrix(2,6)、MyMatrix(2,10)、MyMatrix(3,1)、MyMatrix(4,10)

我无法将向量推回矩阵。考虑到,N×N矩阵称为
MyMatrix
,其中
N=10
,由零和非零元素组成,对角线元素均为零。共有2个向量:
维度为15的正向量
,由从
MyMatrix
提取的10个非零元素组成,以及
ConceptsVector
分别由
N
元素组成。假设向量由以下元素组成
Positive_Vector=[MyMatrix(1,2)、MyMatrix(1,6)、MyMatrix(2,5)、MyMatrix(2,6)、MyMatrix(2,10)、MyMatrix(3,1)、MyMatrix(4,10)、MyMatrix(5,3)、MyMatrix(5,9)、MyMatrix(6,1)、MyMatrix(6,7)、MyMatrix(7,3)、MyMatrix(7,4)、MyMatrix(8,1)、MyMatrix(8,3)]

我的问题是如何使用一个新的向量更新
MyMatrix
,该向量由相同维度但不同的元素值组成,如下操作

C1  = Concepts*NewMyMatrix
可以表演吗

这就是我如何提取
正向量的方法。有人能演示一下如何做相反的操作吗?即将
new\u Positive\u Vector
的新元素推回到
NewMyMatrix
中的相应位置

for ii = 1:10
 for jj = 1:10
  if (MyMatrix(ii,jj)~=0)
    Positive_Vector = MyMatrix(ii,jj);
  end
 end
end

你的解释很模糊,但我假设你想从矩阵中提取非零(或正)元素,对这些元素进行一些运算,然后将它们推回原始矩阵。那么我建议,

MyMatrix = (rand(5)>0.5).*rand(5);

[n,m,Positive_vector] = find(MyMatrix);
k = sub2ind(size(MyMatrix),n,m);

MyMatrix(k) = Positive_vector*2;
第一行用于生成带有一些零的随机矩阵。第二行是找到矩阵的非零元素。如果只需要正元素,则可以将其修改为
find(MyMatrix>0)
。在这里,n和m是非零元素的行数和列数的集合,但我在第三行将其转化为1D索引。第四行是对提取的向量应用一些运算(本例为乘以2),并将其推回原始矩阵中的原始位置

我假设你做的运算比非零元素乘以2更复杂。否则你可以这样做

 MyMatrix = MyMatrix - (MyMatrix>0).*MyMatrix + (MyMatrix>0).*(MyMatrix)*2

如果我理解正确,您应该执行以下操作:

首先,使用您为生成
PositiveVector
提供的代码,您将得到一个元素,而不是一个向量。我假设您希望按如下方式生成它:

[nonZeroRows,nonZeroCols]=find(MyMatrix~=0);
Positive_Vector=MyMatrix(sub2ind(size(MyMatrix),nonZeroRows,nonCols));
NewMyMatrix=zeros(size(MyMatrix));
NewMyMatrix(sub2ind(size(NewMyMatrix),nonZeroRows,nonZeroCols))=`New_Positive_Vector`;
假设现在有一个
New_Positive_Vector
,您想将其插入
NewMyMatrix
,您可以按如下方式操作:

[nonZeroRows,nonZeroCols]=find(MyMatrix~=0);
Positive_Vector=MyMatrix(sub2ind(size(MyMatrix),nonZeroRows,nonCols));
NewMyMatrix=zeros(size(MyMatrix));
NewMyMatrix(sub2ind(size(NewMyMatrix),nonZeroRows,nonZeroCols))=`New_Positive_Vector`;

这里是一个稍微简单一点的方法来做ysakamoto做的事情:

%// some test matrix
MyMatrix = (rand(5)>0.5).*rand(5);

%// Logical indices to the non-zero entries
inds = MyMatrix ~= 0;

%// Do operations on the non-zeros, and assign results back    
MyMatrix(inds) = 2*MyMatrix(inds);

当我找到(MyMatrix~=0)时,正向量中的值都是逻辑1。删除~=0后,代码工作正常。因此,我接受了先前的答案。无论如何,感谢您的帮助,代码片段的其余部分在其他方面都是ok.ok。学习使用
sub2ind
ind2sub
。这些都是强大的命令。谢谢你的解释。