Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何自动创建从矩阵中提取的列变量_Matlab_Matrix_Vector_Octave - Fatal编程技术网

Matlab 如何自动创建从矩阵中提取的列变量

Matlab 如何自动创建从矩阵中提取的列变量,matlab,matrix,vector,octave,Matlab,Matrix,Vector,Octave,我有一个n*n矩阵,我想每3列提取一次,并将结果保存在不同的变量中 我知道可以这样做: A1 = A(:,1:3); A2 = A(:,4:6); A3 = A(:,7:9); 但我想简化和自动化这一点,以管理大量数据 A = [1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15

我有一个
n*n
矩阵,我想每3列提取一次,并将结果保存在不同的变量中

我知道可以这样做:

A1 = A(:,1:3); 
A2 = A(:,4:6); 
A3 = A(:,7:9);
但我想简化和自动化这一点,以管理大量数据

A =

[1     2     3     4     5     6     7     8     9
 2     4     6     8    10    12    14    16    18
 3     6     9    12    15    18    21    24    27
 4     8    12    16    20    24    28    32    36
 5    10    15    20    25    30    35    40    45
 6    12    18    24    30    36    42    48    54
 7    14    21    28    35    42    49    56    63
 8    16    24    32    40    48    56    64    72
 9    18    27    36    45    54    63    72    81]
预期结果:

A1 =               
[1  2   3          
 2  4   6          
 3  6   9          
 4  8   12
 5  10  15
 6  12  18
 7  14  21
 8  16  24
 9  18  27]

A2 =
[4  5   7 
 8  10  12
 12 15  18
 16 20  24 
 20 25  30
 24 30  36
 28 35  42 
 32 40  48
 36 45  54]

A3 =
[7  8   9 
 14 16  18
 21 24  27
 28 32  36 
 35 40  45
 42 48  54
 49 56  63  
 56 64  72 
 63 72  81]

你真的不应该这样分手。如果您真的想在3列块中寻址,那么可以使用

A = (1:9).*((1:9).');
%% create anonymous function which can be called as Ac(1), Ac(2) and so on
Ac = @(n) A(:,(n-1)*3+1:n*3)

octave:2> Ac(1)
ans =

    1    2    3
    2    4    6
    3    6    9
    4    8   12
    5   10   15
    6   12   18
    7   14   21
    8   16   24
    9   18   27

octave:3> Ac(2)
ans =

    4    5    6
    8   10   12
   12   15   18
   16   20   24
   20   25   30
   24   30   36
   28   35   42
   32   40   48
   36   45   54
您可以使用:

C = mat2cell(A,size(A,1),ones(size(A,2)/3,1)*3);
它会将你的矩阵分割成子单元

您可以通过以下方式访问这些单元格包含的信息:

C{1}
C{2}  %and so on

不要创建动态变量。如果真的需要,
A
,将其放入3D阵列中,如下所示:

A = reshape(A,size(A,1),3,[]); 
%where 3 is the number of columns you want to extract at a time
总结 你有几个选择

  • 使用
    eval
    。不要这样做,这是不好的练习。不过,如果你想知道怎么做,它会直接回答你的问题。因为你不应该用这个,我最后才加进去的
  • 使用单元格数组或矩阵。我会这样做,尽管如果数据集非常大,可能会出现内存问题。它确实使索引非常简单,并允许您重写数组的部分
  • 使用匿名函数作为索引的简写。这是一种快速访问数据的只读方式,并且没有内存占用

使用单元阵列和三维矩阵 正如Mathworks在上面链接的博客中所建议的,您可以将分区存储在单元格数组中

myCellArray = cell(size(A,2)/3,1)
for n = 1:3:size(A,2)
    myCellArray{1+(n-1)/3} = A(:,n:n+2)
end
% For accessing:
myCellArray{1} % = A1
或者使用3D矩阵

% option 1
my3DArray = reshape(A,9,3,[]);
% option 2 (same structure as above cell example)
my3DArray = zeros(size(A,1), 3, size(A,2)/3);
for n = 1:3:size(A,2)
    my3DArray(:,:,1+(n-1)/3) = A(:,n:n+2);
end
% For accessing:
my3DArray(:,:,1); % = A1
最好的选择是不要在内存中复制
A
,而是根据需要直接或使用如上所示的辅助函数对其进行索引


使用匿名函数 如果这是一个常见的索引操作,那么您可以创建一个函数,该函数基本上只允许您以简写的方式编写。使用
@()
符号编写的内联函数称为匿名函数

% Create A
A = repmat(1:9, 9, 1);
% Create helper function
An = @(n) A(:,(n-1)*3+1:n*3);
% For accessing:
An(1); % An(1) = [1 2 3; 1 2 3; ...]
但是,不能使用此属性分配

An(1) = [11 12 13; 11 12 13; ...] % wont work
如果您更改
A
然后尝试使用它,您可能会感到惊讶

% Change A
A = repmat(11:19, 9, 1); % A = [11 12 13 14 15 16 17 18 19; 11 12 ...]
% indexing
An(1); % An(1) = [1 2 3; 1 2 3; ...] not the new values!!
为了绕过第二点,我们还可以将
A
传递到helper函数中:

An = @(M,n) M(:,(n-1)*3+1:n*3);
A = repmat(1:9, 9, 1);
An(A,1); % An(1) = [1 2 3; 1 2 3; ...];
A = repmat(11:19, 9, 1);
An(A,1); % An(1) = [11 12 13; 11 12 13; ...]; as desired!

使用
eval
您可以像这样轻松地分配变量

% Create some 9x9 matrix A
A = repmat(1:9, 9, 1);
% Loop through A, create A1, A2, ...
for n = 1:3:size(A,2)
    eval(['A', num2str(1+(n-1)/3), ' = A(:,n:n+2)']);
end
% Gives the result
% A1 = [1 2 3; 1 2 3; ...], A2 = [4 5 6; 4 5 6; ...], ...
这在MATLAB中是非常糟糕的练习 请在上阅读Mathworks的这篇文章。没有理由认为以这种方式设置变量比任何其他方法都好

  • 你不知道你在做多少个变量
  • 您不会知道生成的所有变量名
  • 您已经在内存中复制了“大量数据”
  • eval
    在(不可避免地)出错时更难调试
将现有矩阵的子集放入不同的变量中是一种非常低效的方法,会导致代码更长、更混乱。为什么不想使用
A(:,1:3)
语法(或者甚至使用变量
A(:,c:c+2)
?创建完这些变量后,您打算如何处理它们?我假设A2应该从4 5 6开始…?这是迄今为止最好的一个,但需要注意的是,这不允许分配给变量
A
Ac()
并且不反映创建匿名函数后对
A
所做的更改。我在回答中建议了第二个问题的解决方案