如何在矩阵中追加数组?

时间:2017-03-03 14:44:23

标签: arrays matlab for-loop

我有以下向量:

a = 1:4;
b = zeros(8,8);

我希望以下列方式在a中添加b

b = [1 2 3 4 0 0 0 0
    0 1 2 3 4 0 0 0
    0 0 1 2 3 4 0 0
    0 0 0 1 2 3 4 0
    0 0 0 0 1 2 3 4 
    0 0 0 0 0 1 2 3
    0 0 0 0 0 0 1 2
    0 0 0 0 0 0 0 1
    0 0 0 0 0 0 0 0]

我想使用for循环实现这一点,所以我尝试了:

for i = 2:size(b,1)
   b(i,i:length(a))=a; 
end

但是我收到以下错误Subscripted assignment dimension mismatch.

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

您可以使用ref = FIRDatabase.database().reference("/posts/public/countryCode/US") query = ref.queryOrdered(byChild: "postAuthor").queryEqual(toValue: "TT4l2xyIOFRXI3RZINffcSFs67O2") query.observeEventType(.Value, withBlock: { snapshot in ... 功能

/posts/public/countryCode/US

创建稀疏矩阵,您可以将其转换为密集矩阵:

spdiags

结果:

spdiags(repmat(1:4,8,1),0:3,9,8)

我在Octave中比较full(spdiags(repmat(1:4,8,1),0:3,9,8)) 1 2 3 4 0 0 0 0 0 1 2 3 4 0 0 0 0 0 1 2 3 4 0 0 0 0 0 1 2 3 4 0 0 0 0 0 1 2 3 4 0 0 0 0 0 1 2 3 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 的速度:

spdiags

比较结果:

conv2

答案 1 :(得分:2)

问题是您使用length(a)作为:i:length(a))的第二个输入,它会在每次循环迭代时创建不同大小的向量

i = 1;
size(b(i, i:length(a)))
% 1   4

i = 2;
size(b(i, i:length(a)))
% 1   3

当您尝试将四元素向量分配给此时,显然会出现大小不匹配的情况。相反,您真正想要的是i + length(a) - 1

for i = 1:size(b, 1)
    b(i, i:(i + length(a) - 1)) = a;
end

b = b(:, 1:8);

话虽如此,更好的选择是使用卷积(conv2)沿对角线像这样复制你的值

tmp = conv2(a, eye(8));
output = tmp(:, 1:8);