Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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 - Fatal编程技术网

在matlab中将列表拆分为多个变量

在matlab中将列表拆分为多个变量,matlab,Matlab,如果我有一个简短的列表(比如说两个或三个元素),我希望有一个将其拆分为几个变量的函数。诸如此类: li=[42 43]; [a b]=split(li) --> a=42 --> b=43 我正在寻找一些方法来缩短我在matlab中的代码。在某些情况下,这种方法会很好,例如: positions=zeros(10,3); positions= [....]; [x y z]=split(max(positions,1)) 而不是做: pos=max(positions,1)

如果我有一个简短的列表(比如说两个或三个元素),我希望有一个将其拆分为几个变量的函数。诸如此类:

li=[42 43];
[a b]=split(li)
 --> a=42
 --> b=43
我正在寻找一些方法来缩短我在matlab中的代码。在某些情况下,这种方法会很好,例如:

positions=zeros(10,3);
positions= [....];
[x y z]=split(max(positions,1))
而不是做:

pos=max(positions,1)
x=pos(1);
y=pos(2);
z=pos(3);

可以使用将列表中的值提取到不同的变量中

li = [42 43 44];
tmp = num2cell(li);
[a b c] = deal(tmp{:})

a =
    42
b =
    43
c =
    44

我知道的唯一方法就是使用
deal
。但是,这仅适用于单元格数组,或to
deal
中的显式参数。因此,如果要处理矩阵/向量,必须首先使用
num2cell
/
mat2cell
转换为单元数组。例如:

% multiple inputs
[a b]   = deal(42,43) % a=2, b=3
[x y z] = deal( zeros(10,1), zeros(10,1), zeros(10,1) )

% vector input
li  = [42 43];
lic = num2cell(li);
[a b]=deal(lic{:}) % unforunately can't do num2cell(li){:}
% a=42, b=43

% matrix input
positions  = zeros(10,3);
% create cell array, one column each
positionsc = mat2cell(positions,10,[1 1 1]);
[x y z]    = deal(positionsc{:})
第一种形式很好(
deal(x,y,…)
),因为它不需要显式生成单元格数组

否则,我认为当您必须将矩阵转换为单元格数组,而只是为了再次转换它们时,使用
deal
是不值得的:只需节省开销即可。在任何情况下,仍然需要3行代码:首先定义矩阵(例如,
li
),然后转换为单元格(
lic
),然后执行
deal
deal(lic{:})

如果您真的想减少行数,有一种解决方案,您只需使用自己的函数即可,在此处重复,并进行修改,以便您可以定义要拆分的轴:

function varargout = split(x,axis)
% return matrix elements as separate output arguments
% optionally can specify an axis to split along (1-based).
% example: [a1,a2,a3,a4] = split(1:4)
% example: [x,y,z] = split(zeros(10,3),2)
if nargin < 2
    axis = 2; % split along cols by default
end
dims=num2cell(size(x));
dims{axis}=ones([1 dims{axis}]);
    varargout = mat2cell(x,dims{:});
end

它仍然做矩阵->单元->矩阵的事情。如果向量很小,并且在循环中没有执行过一百万次,则应该没有问题。

如果您确实希望:

a = [1, 2, 3, 4]
[b, c, d, e]=feval(@(x)x{:}, num2cell(a))
结果:

b =
     1
c =
     2
d =
     3
e =
     4
如果您想经常使用此功能,可以快速创建一个匿名函数:

expand = @(A) feval(@(x)x{:}, num2cell(A))
[b, c, d, e]=expand(a)

我相信这将适用于num2cell接受的任何东西,它甚至不必是数字,只需要是一个数组,这在Matlab中几乎是所有的东西。

谢谢,我不知道这个函数
deal
expand = @(A) feval(@(x)x{:}, num2cell(A))
[b, c, d, e]=expand(a)