在matlab中将值切片并分配给3D数组

时间:2015-08-28 03:55:20

标签: arrays matlab slice

我尝试为2D数组的前2维分配值,同时保持第三维的固定。但是我收到了一个错误。

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

3 个答案:

答案 0 :(得分:0)

等式的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];
祝你好运!

答案 1 :(得分:0)

您可以尝试这样的事情:

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

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

答案 2 :(得分:0)

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

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);