سلام ، من یک شرط تعیین میکنم و براساس اون درایه های یک ماتریس رو چک میکنم و اگر اون شرط برقرار بود ، اقدام به صفرکردن اون درایه ماتریس میکنم ، ولی به کندی انجام میشه ، کد من به صورت زیر است و درایه به درایه رو بررسی میکنه ، میشه کمک کنید با دستور دیگری سریعتر اجرا بشه ، بهم گفتن از دستور find میتونی استفاده کنی! ممنونم.
کد:
for it=1:m_size(1)
for ix=1:m_size(2)
if ( abs(dat_fft2(it,ix))<tk )
dat_fft2(it,ix)=0;
end
end
end
tk یک مقدار عددی است و قبلا محاسبه میشود ، m_size هم به صورت زیر قبلا محاسبه شده : m_size=size(m)8
سلام.
قبل از هر چیز، ببینیم که آیا استفاده از find کمکی میکنه یا خیر. کدهای متلب زیر رو می نویسیم که در آن، یک بار از روش معمولی و یک بار هم از find استفاده کرده ایم و دستورات tic و toc را هم نوشته ایم تا زمان اجرای این دو روش را با هم مقایسه کنیم (کدها برای یک مثال دلخواه می باشند) :
کد:
clear all
close all
clc
N=12;
A=magic(N)
B=A;
tic
for nn=1:N
for mm=1:N
if (abs(A(nn,mm))>10)
A(nn,mm)=0;
end
end
end
toc
tic
C=find(abs(B)>10);
C_size=size(C)
for nn=1:C_size(1)
B(C(nn))=0;
end
toc
نتیجه به صورت زیر می باشد :
کد:
A =
144 2 3 141 140 6 7 137 136 10 11 133
13 131 130 16 17 127 126 20 21 123 122 24
25 119 118 28 29 115 114 32 33 111 110 36
108 38 39 105 104 42 43 101 100 46 47 97
96 50 51 93 92 54 55 89 88 58 59 85
61 83 82 64 65 79 78 68 69 75 74 72
73 71 70 76 77 67 66 80 81 63 62 84
60 86 87 57 56 90 91 53 52 94 95 49
48 98 99 45 44 102 103 41 40 106 107 37
109 35 34 112 113 31 30 116 117 27 26 120
121 23 22 124 125 19 18 128 129 15 14 132
12 134 135 9 8 138 139 5 4 142 143 1
Elapsed time is 0.000029 seconds.
C_size =
134 1
Elapsed time is 0.002950 seconds.
با مقایسه دو زمان، به این نتیجه می رسیم که find ، زمان اجرا رو بیشتر هم کرده و بنابراین مفید نخواهد بود.
راهی که به نظر بنده می رسد، استفاده از پردازش موازی است، برای این منظور، می توانید مبحث زیر را بخوانید :
http://kelidestan.com/matlab/matlab-156.php
برای صفرکردن سریع از کد زیر استفاده میکنیم:
کد:
a=[1,2,3;4,5,6;7,8,9];
a(a<4)=0;
(۱۳۹۲/۰۸/۰۵, ۰۱:۵۴ ب.ظ)'4i469x' نوشته: [ -> ]برای صفرکردن سریع از کد زیر استفاده میکنیم:
کد:
a=[1,2,3;4,5,6;7,8,9];
a(a<4)=0;
روش پیشنهادی شما رو با روش معمولی مقایسه می کنیم (از نظر زمان) :
کد:
clear all
close all
clc
N=12;
A=magic(N);
B=A;
tic
for nn=1:N
for mm=1:N
if (abs(A(nn,mm))>10)
A(nn,mm)=0;
end
end
end
toc
tic
B(abs(B)>10)=0;
toc
نتیجه اجرای کد متلب بالا :
کد:
Elapsed time is 0.000029 seconds.
Elapsed time is 0.000021 seconds.
با مقایسه، متوجه می شویم که روش شما سریعتر عمل میکنه. ممنون.
تست این کد وقتی الگوریتم سنگین بنویسید حس میشه ، کد من با دو حلقه for برای صفرکردن ماتریس یک ساعت طول میکشید و با روشی که نوشتم 10 دقیقه شد!!!!!