Matlab中向量的交替块

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

我在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=[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_{:}])