Matlab 使用向量从单元格数组提取数据并转换为数组
我有一个单元格数组[5x1],所有单元格都是列向量,例如:Matlab 使用向量从单元格数组提取数据并转换为数组,matlab,cell-array,Matlab,Cell Array,我有一个单元格数组[5x1],所有单元格都是列向量,例如: exInt = [46x1 double] [54x1 double] [40x1 double] [51x1 double] [ 9x1 double] 我需要有一个向量(vec),其中包含我需要提取的已灭绝的单元格,然后我必须将它们转换成一个单列数组。例如: vec = [1,3]; Output = cell2mat(extInt{vec}) 输出应该成为一个数组[86
exInt =
[46x1 double]
[54x1 double]
[40x1 double]
[51x1 double]
[ 9x1 double]
我需要有一个向量(vec),其中包含我需要提取的已灭绝的单元格,然后我必须将它们转换成一个单列数组。例如:
vec = [1,3];
Output = cell2mat(extInt{vec})
输出应该成为一个数组[86x1双精度]
我的编码方式是:
Error using cell2mat
Too many input arguments.
如果可能,我希望有一个不使用循环的解决方案。您的代码中有一个小错误 改变
Output = cell2mat(extInt{vec});
到
对于单元格,括号和括号都可以用来获取信息。您可以阅读更多关于它的内容,但总结一下:
- 使用大括号{}设置或获取单元格数组的内容
- 使用括号()索引到单元格数组中,以收集另一个单元格数组中的单元格子集
vec
一起使用将产生两个单独的输出(我在下面制作了一个较短版本的exet
)
由于这是两个独立的输出,因此它也将是功能cell2mat
的两个独立输入。由于此函数只接受一个输入,因此会出现错误
另一种选择是您自己的解决方案。获取两个输出,并将它们放在一个新的(未命名)单元格中
现在,这个(单个)结果进入cell2mat
没有问题。
(但请注意,根据单元格中是否有列向量或行向量,可能需要先转置结果。要合并的大小向量(或矩阵)需要匹配/对齐。)
另一种使用括号的方法(在我的解决方案中如上所述)。这里返回原始单元格的一个子集。因此,它直接进入cell2mat
功能
extInt(vec)
ans =
[1] [1x3 double]
我一直在胡思乱想,我把这个条目转换成一个新的单元格数组,并对它进行转置,这样在连接过程中,维度保持相等
Output = cell2mat({extInt{vec}}')
使用
因为您想在已灭绝的
中寻址单元格,而不是单元格的内容
extInt(vec)
extInt{vec}
试着看看发生了什么这里最好的方法是使用由
{}
创建的索引来生成预期的列向量。我们将第一个维度指定为第一个参数,因为您拥有所有列向量,并且我们希望输出也是列向量
out = cat(1, extInt{vec})
给定您的输入,cell2mat
尝试沿第二维度进行连接,这将对您的数据失败,因为所有数据的行数不同。这就是(在您的示例中)在调用cell2mat
之前必须转置数据的原因
更新
这里有一个基准来比较cat
和cell2mat
方法之间的执行时间
function benchit()
nRows = linspace(10, 1000, 100);
[times1, times2] = deal(zeros(size(nRows)));
for k = 1:numel(nRows)
rows = nRows(k);
data = arrayfun(@(x)rand(randi([10, 50], 1), 1), 1:rows, 'uni', 0);
vec = 1:2:numel(data);
times1(k) = timeit(@()cat_method(data, vec));
data = arrayfun(@(x)rand(randi([10, 50], 1), 1), 1:rows, 'uni', 0);
vec = 1:2:numel(data);
times2(k) = timeit(@()cell2mat_method(data, vec));
end
figure
hplot(1) = plot(nRows, times1 * 1000, 'DisplayName', 'cat');
hold on
hplot(2) = plot(nRows, times2 * 1000, 'DisplayName', 'cell2mat');
ylabel('Execution Times (ms)')
xlabel('# of Cell Array Elements')
legend(hplot)
end
function out = cat_method(data, vec)
out = cat(1, data{vec});
end
function out = cell2mat_method(data, vec)
out = cell2mat(data(vec)');
end
这两者之间存在恒定偏移的原因是
cell2mat
在内部调用cat
,但在其上添加了一些额外的逻辑。如果直接使用cat
,可以避免额外的开销。问题是什么?这代码不管用吗?如果没有,请列出原因。很抱歉,我已经编辑了这个问题。尝试一下这个方法。我认为单元格数组只能使用{}@ArturCastiel{}
返回单元格数组元素的内容,()
将单元格数组的子集作为单元格数组的一部分返回,我会用更多的信息更新我的答案为什么你会在四分钟后给出同样的答案?“没有任何努力来解释为什么会发生这样的事情。”阿德里安,正如你所说的,只有4分钟。这是一个合理的短时间,以期待在答案重叠。你为什么要问别人这个问题?我已经在我的答案中添加了一个基准,使用cat
而不是cell2mat
来比较性能。
Output = cell2mat(extInt(vec))
extInt(vec)
extInt{vec}
out = cat(1, extInt{vec})
function benchit()
nRows = linspace(10, 1000, 100);
[times1, times2] = deal(zeros(size(nRows)));
for k = 1:numel(nRows)
rows = nRows(k);
data = arrayfun(@(x)rand(randi([10, 50], 1), 1), 1:rows, 'uni', 0);
vec = 1:2:numel(data);
times1(k) = timeit(@()cat_method(data, vec));
data = arrayfun(@(x)rand(randi([10, 50], 1), 1), 1:rows, 'uni', 0);
vec = 1:2:numel(data);
times2(k) = timeit(@()cell2mat_method(data, vec));
end
figure
hplot(1) = plot(nRows, times1 * 1000, 'DisplayName', 'cat');
hold on
hplot(2) = plot(nRows, times2 * 1000, 'DisplayName', 'cell2mat');
ylabel('Execution Times (ms)')
xlabel('# of Cell Array Elements')
legend(hplot)
end
function out = cat_method(data, vec)
out = cat(1, data{vec});
end
function out = cell2mat_method(data, vec)
out = cell2mat(data(vec)');
end