Matlab中向量的交替块
我在MatlabA和B中有两个向量 我想构造一个向量C,其中我交替a和B的块,其中一个块由一个非零元素和前一个非零元素的所有0组成 比如说Matlab中向量的交替块,matlab,Matlab,我在MatlabA和B中有两个向量 我想构造一个向量C,其中我交替a和B的块,其中一个块由一个非零元素和前一个非零元素的所有0组成 比如说 A=[1 2 0 3 0 4 0 0 0 5]; %in chunks: {1}{2}{0 3}{0 4}{0 0 0 5} B=[6 7 8 9 10 11 0 12 0 0]; %in chunks: {6}{7}{8}{9}{10}{11}{0 12} C=[1 6 2 7 0 3 8 0 4 9 0 0 0 5 10]; 或者,再举一个例子 A
A=[1 2 0 3 0 4 0 0 0 5]; %in chunks: {1}{2}{0 3}{0 4}{0 0 0 5}
B=[6 7 8 9 10 11 0 12 0 0]; %in chunks: {6}{7}{8}{9}{10}{11}{0 12}
C=[1 6 2 7 0 3 8 0 4 9 0 0 0 5 10];
或者,再举一个例子
A=[0 0 4 9 9 9]; %in chunks: {0 0 4}{9}{9}{9}
B=[0 1 0 0 3 4 3 0 9 0 1 1 1]; %in chunks: {0 1}{0 0 3}{4}{3}{0 9}{0 1 1}
C=[0 0 4 0 1 9 0 0 3 9 4 9 3];
你能帮我开发代码吗?这里有一种不用for循环的方法:
clc
clear
A=[0 0 4 9 9 9]; % input1
B=[0 1 0 0 3 4 3 0 9 0 1 1 1]; % input2
a=length(A); % number of element in A
b=length(B); % number of element in B
count1=0; % select data from A
count2=0; % select data from B
c=[]; % for append data
while a >0 && b>0
count1=count1+1;
count2=count2+1;
if(a>0)
if(A(count1)~=0)
c=[c A(count1)];
else
c=[c A(count1)];
count1=count1+1;
while(a>0 &&A(count1)==0) % for repeated zeros i use while
c=[c A(count1)];
a=a-1;
count1=count1+1;
end
if(a>0)
c=[c A(count1)];
a=a-1;
end
end
end
if(b>0)
if(B(count2)~=0)
c=[c B(count2)];
else
c=[c B(count2)];
count2=count2+1;
while(b>1 && B(count2)==0)
c=[c B(count2)];
b=b-1;
count2=count2+1;
end
if(b>0)
c=[c B(count2)]; %#ok<*AGROW>
b=b-1;
end
end
end
a=a-1;
b=b-1;
end
disp('C=')
disp(c)
我建议您测试在数据上使用这种方法是更快还是更慢。以下是一种不使用for循环的方法:
[~, posA] = find(A)
posA = [0,posA]
clear A_
for i = 1:length(posA)-1
A_(i) = {A(posA(i)+1:posA(i+1))}
end
[~, posB] = find(B)
posB = [0,posB]
clear B_
for i = 1:length(posB)-1
B_(i) = {B(posB(i)+1:posB(i+1))}
end
clear C_
for i = 1:min(length(A_), length(B_))
C_(i) = {{A_{1,i},B_{1,i}}};
end
C = cell2mat([C_{:}])
我建议您测试在数据上使用这种方法是快还是慢。在您的第一个示例的Cend中,最后3个是从哪里来的?我的错误,感谢我们使用for循环?这取决于它是快还是不快。我写了这段代码,但它有复杂的算法,我不能很好地解释它。。。我不知道发送代码作为答案在你第一个例子的Cend中最后3个来自哪里?我的错误,谢谢我们使用from for循环?这取决于它是否快我写了这段代码,但它有复杂的算法,我不能很好地解释它。。。我也不知道,发送代码作为回答谢谢。有一个错误。它应该是C=[0 4 0 1 9 0 3 9 4 9 3];取而代之的是C=[0 0 4 0 1 9 0 3 9 4 3];倒数第二个9丢失了抱歉,我编辑了它,谢谢。有一个错误。它应该是C=[0 4 0 1 9 0 3 9 4 9 3];取而代之的是C=[0 0 4 0 1 9 0 3 9 4 3];倒数第二个9丢失抱歉,我用问题中的第二个例子编辑了它,它不起作用。。。它不认为领先的ZooSi在第二个例子被添加之前写这个,当不清楚如何处理前导零点时。我更新了答案。在我问题的第二个例子中,它不起作用。。。它不认为领先的ZooSi在第二个例子被添加之前写这个,当不清楚如何处理前导零点时。我更新了答案。
[~, posA] = find(A)
posA = [0,posA]
clear A_
for i = 1:length(posA)-1
A_(i) = {A(posA(i)+1:posA(i+1))}
end
[~, posB] = find(B)
posB = [0,posB]
clear B_
for i = 1:length(posB)-1
B_(i) = {B(posB(i)+1:posB(i+1))}
end
clear C_
for i = 1:min(length(A_), length(B_))
C_(i) = {{A_{1,i},B_{1,i}}};
end
C = cell2mat([C_{:}])