MATLAB自动为动态更新的单元阵列分配不需要的尺寸
我想生成一个名为MATLAB自动为动态更新的单元阵列分配不需要的尺寸,matlab,indexing,default-value,cell-array,is-empty,Matlab,Indexing,Default Value,Cell Array,Is Empty,我想生成一个名为timeData的3D单元数组,以便timeData(:,:,a)对于某个整数a是一个nx1数据矩阵,行数n随a的值以1:1的对应关系变化。为此,我将生成一个名为data的二维数据数组,即nx1。此赋值语句在for循环中发生,如下所示: % Before iterating, I define an array of indices where I want to store the % data sets in timeData. This choice of storage
timeData
的3D单元数组,以便timeData(:,:,a)
对于某个整数a
是一个nx1数据矩阵,行数n
随a
的值以1:1的对应关系变化。为此,我将生成一个名为data
的二维数据数组,即nx1。此赋值语句在for循环中发生,如下所示:
% Before iterating, I define an array of indices where I want to store the
% data sets in timeData. This choice of storage location is for
% organizational purposes.
A = [2, 5, 9, 21, 34, 100]; % Notice they are in ascending order, but have
% gaps that have no predictability.
sizeA = size(A);
numIter = A(1);
for m = 1:numIter % numIter is the number of data sets that I need to store
% in timeData
% At this point, some code that is entirely irrelevant to my question
% generates a nx1 array of data. One example of this data array is below.
data = [1.1;2.3;5.5;4.4]; % This is one example of what data could be. Its
% number of rows, n, changes each iteration, as
% do its contents.
B = size(data);
timeData(1:B(1),1,A(m)) = num2cell(data);
end
这段代码确实将数据的所有内容按照我的要求放置在timeData
中的适当位置。但是,它也会将{0x0 double}
行添加到时间数据(:,:,a)
的所有2D数组中,用于相应行数n
不是最大行数的任何a
。因此,很多2D数组都有10到几百个我不想要的0值行。对于没有相应数据集的a
值,timeData(:,:,a)
的内容是{0x0 double}
的nx1数组
我需要在后续的代码中迭代timeData
的内容,并且我需要能够找到timeData(:,:,a)
中的数据集的大小,而不必以某种方式忽略所有{0x0 double}
如何修改分配语句以解决此问题
编辑:上述示例的所需输出如下,其中n=5。将此数据集表示为a=9。
timeData(:,:,9) = {[1.1]}
{[2.3]}
{[5.5]}
{[8.6]}
{[4.4]}
现在,考虑A矩阵的一个先前值或后续值的值为<代码>数据< /代码> n=7,n=7是最大的<代码>数据< /代码>集合(最大n值)。代码>时间数据(:,:,9)在我的代码中这样输出:
timeData(:,:,9) = {[1.1]}
{[2.3]}
{[5.5]}
{[8.6]}
{[4.4]}
{[0x0 double]}
{[0x0 double]}
@Dev iL,据我所知,您的回答使我能够删除其中包含{[0x0 double]}
的单元格(这就是我所说的“折扣”)。这是一个很好的方案B,但是有没有办法防止{[0x0 double]}
单元格首先出现
编辑2:更新上述语句“您的答案使我能够删除其中包含{[0x0 double]}
的单元格(这就是我所说的“折扣”)”。cellfun(@isempty…
函数使{[0x0 double]}
单元格转到{[0x0 cell]}
,它不会删除它们。换句话说,size(timeData(:,:,9))
在执行命令之前和之后是相同的。这不是我想要的。我希望大小(timeData(:,:,9))
为5x1,而不管n代表a的任何其他值
编辑3:我刚刚意识到最理想的输出是:
timeData(:,:,9) = {[1.1;2.3;5.5;8.6;4.4]} % An n x 1 column matrix within
% the cell.
但我可以处理这个结果或上面描述的结果。不幸的是,我不了解您的数据集的结构,这就是为什么我不能建议更好的分配方法。但是,我想指出一个操作,您可以在创建数据后帮助处理数据:
cellfun(@isempty,timeData);
上面所做的是返回一个逻辑
数组,其大小为时间数据
,指示哪些单元格包含“空”内容。通常,如果任意数据类型的数组至少有一个维度等于0
,则该数组被视为“空”
你怎样才能利用它为你带来好处
%% Example 1: counting non-empty cells:
nData = sum(~cellfun(@isempty,timeData(:)));
%% Example 2: assigning empty cells in place of empty double arrays:
timeData(cellfun(@isempty,timeData)) = {{}};
不幸的是,我不理解您的数据集的结构,这就是为什么我不能建议更好的赋值方法。但是,我想指出一个操作,您可以在创建数据后帮助处理数据:
cellfun(@isempty,timeData);
上面所做的是返回一个逻辑
数组,其大小为时间数据
,指示哪些单元格包含“空”内容。通常,如果任意数据类型的数组至少有一个维度等于0
,则该数组被视为“空”
你怎样才能利用它为你带来好处
%% Example 1: counting non-empty cells:
nData = sum(~cellfun(@isempty,timeData(:)));
%% Example 2: assigning empty cells in place of empty double arrays:
timeData(cellfun(@isempty,timeData)) = {{}};
我不确定你所说的“不以某种方式打折所有{0x0 double}
”是什么意思。您希望您的单元格数组具有空单元格而不是空的double
数组吗?请您为您在问题中提供的示例指定预期结果(时间数据或后续元素计数)?我觉得你可以保持作业的原样,然后智能地计算非空数据。我不确定你所说的“不以某种方式打折所有{0x0 double}
”是什么意思。您希望您的单元格数组具有空单元格而不是空的double
数组吗?请您为您在问题中提供的示例指定预期结果(时间数据或后续元素计数)?我觉得你可以保持作业的原样,然后智能地计算非空数据。