在 matlab 中对 3D 数组进行切片和赋值

Slicing and assigning values to a 3D array in matlab

我尝试为二维数组的前两个维度赋值,同时保持第三个维度不变。但是我收到一个错误。

Assignment has fewer non-singleton rhs dimensions than non-singleton subscripts

请参阅下面的代码片段(请注意,我使用 here 中的 allcomb())。

知道为什么以及如何解决吗?

A = zeros(2, 94, 10);
combs = allcomb(1:2,1:94);
A(combs(:,1), combs(:,2), 1) = 1:(2*94);

请注意,我的意图是编写以下的矢量化形式:

A = zeros(2, 94, 10);
combs = allcomb(1:2,1:94)
vals = 1:(2*94);
for k=1:length(vals)
    A(combs(k,1), combs(k,2), 1) = vals(k);
end

等式右侧的 rhs 需要与 lhs 具有相同的维数。在本例中,您尝试将 N x 1 向量分配给 2 x N x 1 数组。

尝试,

A = zeros(2, 94, 10);
combs = allcomb(1:2,1:94);
val = (1:2*94)';
A(combs(:,1), combs(:, 2), 1) = [val, val];

祝你好运!

您可以尝试这样的操作:

A = zeros(2, 94, 10);
B = A;
combs = allcomb(1:2, 1:94);
vals = 1:(2*94);
for k=1:length(vals)
      A(combs(k, 1), combs(k, 2), 1) = vals(k);
end

% here it starts
val = repmat(1:94, 94, 2);
B(combs(:, 1), combs(:, 2), 1) = [val; val + 94];

isequal(A, B)   % returns 1

这应该会给你想要的结果。

我找到了我正在寻找的简短而优雅的实现,使用 sparse() 初始化:

A = zeros(2, 94, 10);
combs = allcomb(1:2,1:94);
vals = 1:(2*94);

%% Here it is: 
A(:,:,1) = sparse(combs(:,1), combs(:,2), vals);