有一种优雅的方式来创建动态数组在MATLAB ?

151(30天)
有一种优雅的方式来创建动态数组在MATLAB ?
例如,我的程序有一个循环,程序遍历循环,将生成一些数值,应该存储在一个数组中。然而,我无法知道这些生成的值的精确计算,因为他们这一代人取决于一个if - else逻辑。如何预先分配这个数组用于存储这些值的大小。

接受的答案

1月
1月 2011年11月11日
是更有效分配太多的内存(只要符合可用的RAM)比让一个数组成长。通常你可以determin最大大小和作物数组之后:
n = 1000;
一个= 0 (n, 6);
我= 0;
i = 1: n
如果兰德< 0.5
我=我+ 1;
(我:)=兰德(1,6);
结束
结束
一个=(1:我:);
但有时估计大小的上限是不可能的。然后你可以预先分配的块。这实际上同样的问题作为一个省略预先分配,但与一个非常小的效果:
n = 1000;
一个= 0 (0,6);
我= 0;
imax = 1000;
i = 1: n
如果兰德< 0.5
我=我+ 1;
如果我> imax%分配块的1000行
imax = imax + 1000;%编辑
(imax:) = 0;
结束
(我:)=兰德(1,6);
结束
结束
一个=(1:我:);
6个评论
康纳现在是Brickey
康纳现在是Brickey 2023年2月23日
上面的代码有一个额外的问题,也许这是我十年以来新晚了。原始代码运行时
n = 10;
一个= 0 (n, 6);
我= 0;
i = 1: n
如果兰德< 0.5
我=我+ 1;
(我:)=兰德(1,6);
结束
结束
一个=(1:我:);
答案是
一个
一个= 10×6
0 0 0 0 0 0 0.6024 0.4031 0.9445 0.3273 0.6586 0.4921 0.1816 0.4943 0.9874 0.1688 0.5664 0.6148 0.2693 0.4955 0.3752 0.8397 0.3598 0.6651 0.1448 0.4836 0.2823 0.2843 0.2805 0.2648 0 0 0 0 0 0 0.3728 0.0136 0.2125 0.1451 0.0941 0.3619 0.1938 0.3420 0.8465 0.5127 0.5931 0.6998 0.9429 0.0022 0.6681 0.0910 0.1146 0.0129 0.5347 0.1333 0.9755 0.0400 0.1895 0.7716
这不是裁剪删除0。我认为问题在于,尽管我先设置为0,for循环重置我的价值,negatting柜台。如果索引变量循环改变的j
n = 10;
一个= 0 (n, 6);
我= 0;
j = 1: n
如果兰德< 0.5
我=我+ 1;
(我:)=兰德(1,6);
结束
结束
B =(1:我:);
我们得到了
B
B = 6×6
0.8849 0.0960 0.3774 0.6824 0.7197 0.0934 0.9566 0.9143 0.0197 0.0182 0.4071 0.0905 0.2312 0.5482 0.0047 0.4678 0.7558 0.6598 0.9475 0.7795 0.7933 0.7032 0.8785 0.4811 0.4386 0.0435 0.0677 0.3756 0.7877 0.0213 0.8197 0.9326 0.0958 0.6741 0.8373 0.2618
实际的裁剪数据。
让我知道如果我丢失的东西:)

登录置评。

更多的答案(3)

乔纳森
乔纳森 2011年11月11日
liangjian,
你可以preallocate基于迭代的数量。这样的尝试。
numIter = 100;
数组=南(numIter, 3);
我= 1:numIter
如果兰迪(2)= = 1
newValues =(我10 * 100 *);
阵列(我:)= newValues;
结束
结束
数组=数组(~ isnan(数组(:1)):);

图像分析
图像分析 2011年11月11日
当然,只是不做任何MATLAB的工作方式。刚刚开始使用这个变量。不过最好preallocate, Jan和乔纳森告诉你,即使这只是一个估计。如果你preallocate 0()之类的,然后你可以自动调整大小后通过分配。例如:
一个= 0 (100100);% Preallocate猜测
(200、300)= 4;%自动调整大小。
聪明的花招,罗兰海岸preallocate就是分配的右下方元素数组,例如:
b (480640) = 0;
请注意虽然只有 右下方的元素 需要您设置的值,而不是整个数组。数组的其余部分将是零。例如:
b (4,2) = 40
b =
0 0
0 0
0 0
0 40

Hooman Sedghamiz
Hooman Sedghamiz 2018年3月6日
当别人正确地指出,这不是一个好的做法使用不预分配的数组作为高度降低你的跑步速度。有两种方法可以做到这一点;
解决方案1:事实上是可能也有在Matlab环境下的动态结构。然而,这不是一个本地Matlab结构。最近,我不得不在Matlab编写一个图遍历脚本需要一个动态的堆栈。这样做,您可以简单地使用一个堆栈从java库为例。很强大,你可以处理几乎所有不同类型的数据!你可以借这从java在matlab;
%在matlab进口从java堆栈效用
进口java.util。*;
%然后使用下面的命令处理堆栈
=堆栈();
A.push(我);%插入我的堆栈
A.pop ();%就会弹出一个元素
解决方案2:简说,preallocate高估了大阵,然后修剪后你操作。

标签

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!