如何完善我的zigzag matlab功能?

时间:2015-05-06 07:15:27

标签: matlab

我收到了以下问题:

编写一个函数调用zigzag,它接收一个二维数组A并返回一个1维数组,该数组是从位置A开始以zigzag方式遍历(1,1)。 / p>

示例:

A =[1 2 3 4 5 6

   7 8 9 1 3 4 

   3 4 5 6 3 1

   3 4 5 6 7 8]

zigzag(A)应该返回:

[1 2 3 4 5 6 4 3 1 9 8 7 3 4 5 6 3 1 8 7 6 5 4 3]

我解决它的方式,我不确定这是否是一个正确的方法。我很高兴知道这是否完美以及如何改进我的答案:

function B=zigzag(A)

[r,c]=size(A);

B= reshape(A’,1,:);

m=0

n=0

For r>m+2

m=m+2;

n=n+1;

    For i=1:c

    B(nc+i)=B(2cn-i+1);

    End



End

disp(B)

1 个答案:

答案 0 :(得分:7)

如果它能为您提供正确的输出,那么您当然可以做正确的事情。但是,我要做的是访问矩阵的偶数行,反转方向以便它们以相反的顺序显示,转置矩阵然后解开它。

我们转置它的原因是因为当我们在MATLAB中解开矩阵时,这意味着矩阵的堆叠在一起,以便生成一个单一的向量。我们希望堆叠在一起,并使相反的偶数行允许您进行预期的之字形。如果您希望将行堆叠在一起,则需要首先转置矩阵以使行成为列,并且当您解开此矩阵时,您将把行堆叠在彼此之上而不是创建单个载体。

这样的事情:

B = A; %// Make a copy
B(2:2:end,:) = fliplr(B(2:2:end,:)); %// Flip even rows
B = reshape(B.', 1, []); %// Unravel

以你的例子,我得到:

B =

  Columns 1 through 13

     1     2     3     4     5     6     4     3     1     9     8     7     3

  Columns 14 through 24

     4     5     6     3     1     8     7     6     5     4     3