我有一个单元格数组[5x1],所有单元格都是列向量,例如:
exInt =
[46x1 double]
[54x1 double]
[40x1 double]
[51x1 double]
[ 9x1 double]
我需要有一个载体(vec),其中包含我需要提取的extInt中的细胞,然后我必须将它们转换为单个列数组。如:
vec = [1,3];
Output = cell2mat(extInt{vec})
输出应该成为一个数组[86x1 double]。
我编码的方式我得到了:
Error using cell2mat
Too many input arguments.
如果可能的话,我想要一个不使用循环的解决方案。
答案 0 :(得分:4)
此处最好的方法是使用cat
以及{}
索引创建的comma-separted list来生成预期的列向量。我们将第一个维度指定为第一个参数,因为您拥有所有列向量,并且我们希望输出也是列向量。
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
,则可以避免额外的开销。
答案 1 :(得分:3)
您的代码中有一个小错误
更改
Output = cell2mat(extInt{vec});
到
Output = cell2mat(extInt(vec));
对于单元格,括号和括号都可用于获取信息。您可以阅读更多相关信息here,但总结一下:
- 使用花括号{}来设置或获取单元格数组的内容。
- 使用括号()索引到单元格数组中,以便在另一个单元格数组中收集一组单元格。
在您的示例中,使用带有索引向量vec
的括号将生成2个单独的输出(我在下面创建了extInt
的较短版本)
extInt = {[1],[2 3],[4 5 6]};
extInt{vec}
ans =
1
ans =
4 5 6
由于这是2个单独的输出,它也将是函数cell2mat
的2个单独输入。由于此功能只接受一个输入,因此会出现错误。
另一种选择是在您自己的解决方案中。取两个输出并将它们放在一个新的(未命名的)单元格
中{extInt{vec}}
ans =
[1] [1x3 double]
现在,这个(单个)结果进入cell2mat
没有问题。
(请注意,您可能需要根据单元格中是否有列或行向量来转置结果。要组合的大小向量(或矩阵)需要匹配/对齐。)
使用括号的另一种方法(如我的解决方案中所述)。这里返回原始单元的子集。因此,它直接进入cell2mat
函数。
extInt(vec)
ans =
[1] [1x3 double]
答案 2 :(得分:0)
我一直在搞乱,我通过将此条目转换为新的单元格数组并对其进行转置以使尺寸保持等效于连接过程来实现此目的
Output = cell2mat({extInt{vec}}')
答案 3 :(得分:0)
使用
Output = cell2mat(extInt(vec))
因为您要在extInt
中寻址单元格而不是单元格的内容
extInt(vec)
extInt{vec}
尝试那些看看最新情况