我有MATLAB代码将n维点(n> 1)插入到矩阵(myPointMatrix)中,并且想到如何插入第一个点.
现在程序检查myPointMatrix插入点之前的大小.如果是1x1,myPointMatrix则设置为等于当前点.否则,附加当前点.这个if-statement只有一次,但每次插入一个点时都要进行评估,这是非常频繁的.
删除if和尝试追加myPointMatrix使得MATLAB可以理解地抱怨矩阵维度不一致.删除if-statement和inialization myPointMatrix = 0导致MATLAB找到myPointMatrixundefined.也可以理解.
如何初始化myPointMatrix以便我可以删除if-statement?还是有其他智能解决方案吗?
myPointMatrix = 0;
for x=0:limit
for y=0:limit
for z=0:limit
tempPoint = [x y z];
if (length(myPointMatrix) == 1)
myPointMatrix = tempPoint;
else
myPointMatrix = [myPointMatrix; tempPoint];
end
end
end
end
Run Code Online (Sandbox Code Playgroud) 我在Matlab中有一个大型(多GB)数组,我想截断¹.天真地,我认为截断不需要太多内存,但后来我意识到它可能会:
>> Z = zeros(628000000, 1, 'single');
>> Z(364000000:end) = [];
Out of memory. Type HELP MEMORY for your options.
Run Code Online (Sandbox Code Playgroud)
除非Matlab在截断之前做了一些聪明的优化,否则Z这段代码实际上会创建一个数组(类型为double!)364000000:628000000.我不需要这个数组,所以我可以这样做:
>> Z = Z(1:363999999);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,第二个例子有效,并且对我来说没问题.但为什么它有效呢?如果Z(364000000:end) = 0由于没有所需的中间阵列的存储器364000000:628000000,那么,为什么不Z = Z(1:363999999)因未能所需中间阵列的存储器1:363999999,这是较大的?当然,我不需要这个中间数组,并且对于在没有任何中间数组的情况下截断我的数组的解决方案感到满意,或者,如果Matlab优化了特定方法,则会失败.
¹原因:我正在处理数据,但不知道预分配多少.我做了一个有根据的猜测,经常我分配太多.我根据可用内存选择块大小,因为拆分更少的块意味着更快的代码.所以我想避免任何不必要的内存使用.另见关于按块分配的这篇文章.
我有一个2D单元阵列.我想做以下事情:
y = some_number;
row(x) = [row(x) another_row(y)];
Run Code Online (Sandbox Code Playgroud)
但是,在发生这种情况之前,不会定义row(x),因此它不起作用!当没有定义行(x)时,如何简单地将another_row(y)附加到行(x)上?
对不起,这在其他语言中很容易,但我不确定在MATLAB中怎么做!
谢谢.
我正在做以下事情
for i = 1:m,
index = 0;
for j = 1:n,
index = index+values(i,j)*2^(j-1);
if (j==1)
symbol_chip = chip_values(index+1,:);
else
symbol_chip = [symbol_chip chip_values(index+1,:)];
end
end
end
Run Code Online (Sandbox Code Playgroud)
它告诉我以下内容:
symbol_chip可能会在循环中成长.考虑预先分配速度.
有任何想法吗?
我需要在matlab中创建一个包含非常大的结构的队列.我不知道这个队列会有多大.Matlab没有链表,我担心重复分配和复制真的会减慢这个必须运行数千次的代码.我需要某种方式来使用可扩展的数据结构.我在matlab帮助中找到了几个链表的条目,但我无法理解发生了什么.有人可以帮我解决这个问题吗?
对于我的工作,我必须在Matlab中设置一个项目,这不是我选择的语言,我对效率有一些疑问.
我目前正在处理具有多个属性的点集合.而不是将所有这些放在相同长度的单独数组中,我更倾向于使用Matlab的用户定义类来创建Point对象的单个数组.例如:
% Point.m
classmethod Point < handle
properties
x, y, prop1, prop2
end
end
% script.m
... % define x(100), y(100), prop1(100), prop2(100)
points(100) = Point; % this seems to be the way to allocate an object vector
for i = 1:100
points(i).x = x(i); % copy values into object
points(i).y = y(i);
points(i).prop1 = prop1(i);
points(i).prop2 = prop2(i);
end
Run Code Online (Sandbox Code Playgroud)
我更喜欢上述的原因是审美(对象应该是对象)和实用,因为它允许我轻松地创建点的子集而无需索引几个不同的数组.
然而,我想知道它是否是最有效的做事方式,考虑到点数可能会在数千或数万个数量级上变得非常大.我的主要问题是:
或者更通用一些:组织我的观点的最佳方式是什么?
期待您的建议!
在Matlab中,建议不要使用这种类型的算法("增长数组")
mine = []
for i=1:100,
mine = [mine,randn(1)]
end
Run Code Online (Sandbox Code Playgroud)
而似乎许多Python的例子都显示了这种算法(虽然这是一个非常糟糕的例子):
import numpy.random as rand
mine = []
for i in range(100):
mine.append(rand.random(1)[0])
Run Code Online (Sandbox Code Playgroud)
我想知道为什么 - 有什么区别?
因此,reserve当您大致了解尺寸要求时,这非常有用.有没有人知道在MATLAB中预先分配数组的类似方法?
我对hacky(但有效)方法并不感兴趣,如下所示:
x = zeros(1000,1);
for i = 1:10000
if i > numel(x)
x = [x;zeros(size(x))];
end
x(i) = rand;
end
x(i+1:end) = [];
Run Code Online (Sandbox Code Playgroud) 我有一个for循环遍历一个数组...
for i=1:length(myArray)
Run Code Online (Sandbox Code Playgroud)
在这个循环中,我想检查myArray的值,如果满足某些条件,则将其添加到另一个数组myArray2.我查看了MATLAB文档,但是没有在创建数组时发现任何内容,而没有在初始化时声明所有值或一次性将数据读入其中.
非常感谢!
可能重复:
MATLAB中的可扩展数据结构
所以在我目前的MATLAB脚本中,我有一个非常大的不确定大小的增长数组.目前我无能为力,因为如果我实际上预分配,它将需要比它应该需要的内存多很多倍的内存(最大可能的值是每像素640,但通常它是2的线上的东西5).
通常在这种情况下,我将使用C++中的向量或其他东西,它在给定容量方面呈指数级增长.但我认为Matlab中的矩阵开始碎片比目的驱动的C++向量快得多.
你们认为这是什么样的最佳选择?或者我应该坚持使用普通数组并希望顺序添加大约100k个元素会起作用吗?
提前致谢.
matlab ×10
arrays ×3
memory ×2
optimization ×2
c++ ×1
linked-list ×1
matrix ×1
object ×1
performance ×1
python ×1
truncate ×1