通过将矩阵分配到更大的分配内存中,matlab 会在“复制”它时以某种方式复制它,如果要复制的矩阵足够大,则会出现内存溢出。这是示例代码:
main_mat=zeros(500,500,2000);
n=500;
slice_matrix=zeros(500,500,n);
for k=1:4
parfor i=1:n
slice_matrix(:,:,i)=gather(gpuArray(rand(500,500)));
end
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix; %This is where the memory will likely overflow
end
Run Code Online (Sandbox Code Playgroud)
有什么方法可以slice_matrix在main_mat没有开销的情况下“粉碎” ?提前致谢。
编辑:
main_mat预先分配时发生溢出。如果main_mat用main_mat=zeros(500,500,1);(较小的尺寸)初始化,则不会发生溢出,但由于在将矩阵分配给它之前没有完成分配,它会减慢速度。随着范围的k增加,这将显着降低性能。
我试图从定义其索引的矩阵块重新采样我的数据.希望这个例子可以说清楚:
A=rand(18400,100);
A_IDX=randi([1 100],[18400 100]);
Run Code Online (Sandbox Code Playgroud)
A_IDX包括18400行和100列.我想A在A_IDX索引处提取矩阵.结果将是这样的:
A=[1 2 3; 4 5 6];
A_IDX=[1 3; 2 3];
A_Result=[1 3; 5 6];
Run Code Online (Sandbox Code Playgroud)
我尝试A(:,A_IDX)但是这给了我1840x184000的矩阵大小,这不是我想要做的第一个.有人可以帮忙吗?提前致谢!
让我们说我有A = [1:8; 11:18; 21:28; 31:38; 41:48]现在我想将第4列的所有内容移动到行位置.我该如何实现这一目标?
A =
1 2 3 4 5 6 7 8
11 12 13 14 15 16 17 18
21 22 23 24 25 26 27 28
31 32 33 34 35 36 37 38
41 42 43 44 45 46 47 48
Run Code Online (Sandbox Code Playgroud)
至
A2 =
1 2 3 4
11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44
5 6 7 8
15 16 …Run Code Online (Sandbox Code Playgroud) 那可能吗?假设我知道维度,我想确定变量将占用多少字节,以便在进行计算之前可以采用适当的过程.经典方式:
A = zeros(500, 500, 500);
whos A;
Run Code Online (Sandbox Code Playgroud)
您可能建议在whos命令后删除变量,但如果MATLAB几乎达到了最大内存容量,则可能无效.有一种优雅的方式来做到这一点?
我尝试将命令输出通过管道传输到变量,然后比较这些变量是否具有相同的值。但是它总是返回两个变量具有相同的值(即使不是)。下面是我的代码:
@echo off
goto main
:main
setlocal
echo 111 | (set /p readvalue= & set readvalue)
echo 123 | (set /p readvaluebash= & set readvaluebash)
if "%readvalue%"=="%readvaluebash%" goto valid
if NOT "%readvalue%"=="%readvaluebash%" goto invalid
:valid
echo yes
pause
goto finish
:invalid
echo no
pause
goto finish
:finish
endlocal
Run Code Online (Sandbox Code Playgroud)
我总是得到yes结果。有人知道我的错误吗?提前致谢!
我循环触发视频,利用其数据,并使用imshow. 外置摄像头有 30 fps,但是imshow在循环中使用时,它将帧速率大幅降低到 5-7 fps 左右。有解决方法吗?下面是片段:
Vid = videoinput('some_cam',1);
triggerconfig(Vid, 'manual');
Vid.FramesPerTrigger = 1;
Vid.TriggerRepeat = inf;
viewer = vision.DeployableVideoPlayer();
start(Vid);
himg = figure;
while ishandle(himg)
trigger(Vid);
[image, timeStamp] = getdata(Vid);
imshow(image); %This line significantly reduce the performance
%Do something with the images...This part is important and would need as many frame rate as possible
end
Run Code Online (Sandbox Code Playgroud)
所以我在想,如果我发送imshow到另一个线程上运行怎么办?但在这种情况下,我不知道该怎么做,因为我需要访问image. 预览或任何其他命令在我的情况下不起作用,因为我必须image事先进行一些更改。
matlab ×5
matrix ×2
batch-file ×1
image ×1
indexing ×1
loops ×1
memory ×1
optimization ×1
size ×1