2

我在 MatLab 中有一个样本矩阵

>> A=[0 0 0 0; 5 1 4 6; 10 87 74 34]

A =

     0     0     0     0
     5     1     4     6
    10    87    74    34

我想创建一个新向量,其中包含没有第一列的 A 元素。此外,每个元素(从第 1 行第 2 列开始)将仅放置在一列中。所以目标向量如下。

newdata=

        0
        0
        0
        1
        4
        6
        87
        74
        34

我创建了一个m-file它应该这样做但我得到的只是一个向量

newdata=

        34
        34
        34
        34
        34
        34
        34
        34
        34

我的代码是

newdata=zeros(size(A,1)*(size(A,2)-1),1);
for ii=1:size(A,1)
    for jj=2:size(A,2)
        for n=1:(size(A,1)*(size(A,2)-1))
            newdata(n)=A(ii,jj);
        end
    end
end

我知道这是微不足道的,但我找不到我的错误。任何帮助都非常受欢迎!

4

4 回答 4

3

首先,您的错误是您已经编写n为最内层循环,这就是为什么newdata每个元素一次又一次地被覆盖(当然,除了第一列条目)。其次,这是一种效率极低的方式。您应该利用 MATLAB 的colon运算符。这可以按如下方式完成:

A=A(:,2:end);  %removing first column
A=A.';
newdata=A(:); %collapsing it to a vector and the transpose was done 
%to get the desired format of the vector `newdata`. You are welcome to 
%try the code without transpose and see what difference it makes. 
于 2013-04-28T08:48:54.927 回答
3

您的主要“错误”是您试图重新发明轮子。

第一步是摆脱第一列。

B = A(:,2:end)

最后一个是重塑矩阵:

B = reshape(B.',1,[])'

无需编写自己的代码。我认为这样更容易。

于 2013-04-28T08:49:19.380 回答
1

最简单的方法不是使用嵌套循环。Matlab 有很多你应该尝试使用的内置功能。

试试这个:

newdata = A;
newdata(:,1) = [];     %this will eliminate the first column of data
newdata = newdata';    %convert the matrix into its transpose in preparation for the next step
newdata = newdata(:);  %automatically create the desired vector with this operator
于 2013-04-28T09:00:28.827 回答
1

正如@pivovarit 所述,您可以简单地使用reshape. 但是,您可能还需要注意,由于 MATLAB 以列主要形式存储数字,如果您实际上想简单地线性访问数据,通过设置,例如C

C = A(:,2:end)'

您可以简单地将元素称为C(1)C(2)C(6)等,就像您对列向量所做的那样。

于 2013-04-28T09:08:49.833 回答