將三維向量改為二維,乙個加速程式執行的方法

2021-09-24 18:19:55 字數 1140 閱讀 5045

原函式

function [routeflow]=calculatex(x,route3d)

maxday=130;

routeflow=sparse(zeros(118,maxday));%路線/130天

for i = 1:21

for j = 1:maxday-20

t=x(i,j).*reshape(route3d(i,:,:),[118,130]);

if j>1

t(:,j:j+11)= t(:,1:12);

t(:,1:j-1)=0;

endrouteflow=routeflow+t;

endend

新函式

function [routeflow]=calculatex(x,route2d)

max=90;

routeflow=sparse(118,130);%路線/130天

for i = 1:21

r=route2d(1+(i-1)*118:i*118,:);

for j = 1:max

t=x(i,j).*r

if j>1

t=circshift(t,j-1,2);

endrouteflow=routeflow+t;

endend

這段指令碼要解決的問題是將21個118x130的矩陣與21x130個對應資料相乘,並將積移位後相加。

其中簡化的點在於,

多個二維資料本來使用三維向量儲存zeros(21,118,130),多餘的一維代表不同的二維向量。 新**則全部儲存為二維向量zeros(21*118,130),使用行的擷取來獲取不同編號的的資料。

for i = 21

2d(1+(i-1)*118:i*118,:)=cell

end

矩陣的平移操作,原**使用了較複雜的方法,新**直接使用circshift解決,簡潔而高效。

將內迴圈中的r=route2d(1+(i-1)118:i118,:);放入外迴圈,大大減少該條**被呼叫的次數

結果:原函式迭代十次花費2.407s或3s以上

新函式的1,2兩點則為1.636s,加入第三個改進後,速度進一步減為0.889s

一維,二維,三維陣列,vector 初始化

1.用memset初始化陣列 1 按照位元組賦值 2 標頭檔案在中 注 由於memset函式是按照位元組賦值的,所以對int型陣列用該函式時,只能是0或 1,否則會出錯,這裡,不管陣列是多少維的,語法均為 int dp 84 84 84 2 memset dp,0,sizeof dp 只能賦值0或 ...

將乙個二維陣列合併成乙個一維陣列

大家都知道php有內建的陣列合併函式array merage arr,arr1,arr2,arr3 那如何把乙個二維陣列如array array a 1,b 2 array c 3,d 4 合併成如下的陣列 第一種 方法當然是遞迴法呢,如下 newarray array function chang...

有關python中一維,二維,三維陣列的理解

假設某比賽分a,b,c三個組。每組有參賽者5名,分別來自15個不同的國家。對於a組來說,一維陣列相當於建立乙個姓名列表 name 參賽者a1 參賽者a2 參賽者a5 列表裡有5個元素,代表五個參賽者。接著上面的,對於a組來說,二維陣列相當於建立乙個 姓名 國籍 陣列 輸出的 5,2 表示,5行2列。...