Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Matlab:基于索引的矩阵值矢量化赋值_Arrays_Matlab_Matrix_Vectorization - Fatal编程技术网

Arrays Matlab:基于索引的矩阵值矢量化赋值

Arrays Matlab:基于索引的矩阵值矢量化赋值,arrays,matlab,matrix,vectorization,Arrays,Matlab,Matrix,Vectorization,如果此问题重复,或者此问题的解决方案在Matlab中非常简单,请提前道歉。我有一个M x N矩阵a,一个1 x M向量ind,还有另一个向量val。比如说, A = zeros(6,5); ind = [3 4 2 4 2 3]; val = [1 2 3]; 我想将以下代码矢量化: for i = 1 : size(A,1) A(i, ind(i)-1 : ind(i)+1) = val; end >> A A = 0 1 2 3

如果此问题重复,或者此问题的解决方案在Matlab中非常简单,请提前道歉。我有一个M x N矩阵
a
,一个1 x M向量
ind
,还有另一个向量
val
。比如说,

A = zeros(6,5);
ind = [3 4 2 4 2 3];
val = [1 2 3];
我想将以下代码矢量化:

for i = 1 : size(A,1)
    A(i, ind(i)-1 : ind(i)+1) = val;
end

>> A

A =

 0     1     2     3     0
 0     0     1     2     3
 1     2     3     0     0
 0     0     1     2     3
 1     2     3     0     0
 0     1     2     3     0

也就是说,对于
A
的第i行,我想在某个位置插入向量
val
,如
ind
的第i项所示。在没有for循环的情况下,在Matlab中实现这一点的最佳方法是什么?

可以使用的掩蔽功能来实现:构建一个掩蔽,告诉值将放置在何处,然后将这些值填入。在这样做的过程中,更容易使用列而不是行(因为Matlab的列主顺序),并在末尾转置

下面的代码确定最终
A
最小列数,以便所有值都适合指定位置

您的示例对
ind
应用了位移
-1
。该代码包括一个可修改的通用置换

%// Data
ind = [3 4 2 4 2 3]; %// indices
val = [1 2 3]; %// values
d = -1; %// displacement for indices. -1 in your example

%// Let's go
n = numel(val);
m = numel(ind);
N = max(ind-1) + n + d;  %// number of rows in A (rows before transposition)
mask = bsxfun(@ge, (1:N).', ind+d) & bsxfun(@le, (1:N).', ind+n-1+d); %// build mask
A = zeros(size(mask)); %/// define A with zeros
A(mask) = repmat(val(:), m, 1); %// fill in values as indicated by mask
A = A.'; %// transpose
以您的示例为例:

A =
     0     1     2     3     0
     0     0     1     2     3
     1     2     3     0     0
     0     0     1     2     3
     1     2     3     0     0
     0     1     2     3     0
结果
d=0
(无位移):


如果你能控制一点过量,这里有一个带有
bsxfun
添加功能的-

样本运行-

>> ind
ind =
     3     4     2     4     2     3
>> val
val =
     1     2     3
>> A = zeros(6,5);
>> N = numel(ind);
>> A(bsxfun(@plus,N*[-1:1]',(ind-1)*N + [1:N])) = repmat(val(:),1,N)
A =
     0     1     2     3     0
     0     0     1     2     3
     1     2     3     0     0
     0     0     1     2     3
     1     2     3     0     0
     0     1     2     3     0

哈哈!我偷了你的答案!:-)@路易斯门多我怕我偷了你的东西!几天前,它完全脱离了主题,让我思考,我从来没有想过
bsxfun
会出现在一篇元帖子中,但你最近发表了一篇关于10-M问题的帖子,让我想到了这一点,所以也谢谢你!)顺便说一句,我喜欢这个术语
屏蔽能力
,它听起来像是bsxfun有一种超级能力,从某种程度上说这是真的!)这是你的术语,是你创造的!是的,
bsxfun
应该得到一个元帖子,你也是这样做的!:-D
N = numel(ind);
A(bsxfun(@plus,N*[-1:1]',(ind-1)*N + [1:N])) = repmat(val(:),1,N)
>> ind
ind =
     3     4     2     4     2     3
>> val
val =
     1     2     3
>> A = zeros(6,5);
>> N = numel(ind);
>> A(bsxfun(@plus,N*[-1:1]',(ind-1)*N + [1:N])) = repmat(val(:),1,N)
A =
     0     1     2     3     0
     0     0     1     2     3
     1     2     3     0     0
     0     0     1     2     3
     1     2     3     0     0
     0     1     2     3     0