انجمن سایت کلیدستان



صفرکردن شرطی درایه های یک ماتریس به صورت سریعزمان کنونی: ۱۳۹۵/۰۹/۱۴، ۱۲:۴۰ ب.ظ
کاربران در حال بازدید این موضوع: 1 مهمان
نویسنده: 4i469x
آخرین ارسال: 4i469x
پاسخ 5
بازدید 2309

رتبه موضوع:
  • 2 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
صفرکردن شرطی درایه های یک ماتریس به صورت سریع

صفرکردن شرطی درایه های یک ماتریس به صورت سریع

#1
سلام ، من یک شرط تعیین میکنم و براساس اون درایه های یک ماتریس رو چک میکنم و اگر اون شرط برقرار بود ، اقدام به صفرکردن اون درایه ماتریس میکنم ، ولی به کندی انجام میشه ، کد من به صورت زیر است و درایه به درایه رو بررسی میکنه ، میشه کمک کنید با دستور دیگری سریعتر اجرا بشه ، بهم گفتن از دستور 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
 
دوست دارم زندگی رو . . . 
پاسخ

صفرکردن شرطی درایه های یک ماتریس به صورت سریع

#2
سلام.
قبل از هر چیز، ببینیم که آیا استفاده از 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
 
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط 4i469x

صفرکردن شرطی درایه های یک ماتریس به صورت سریع

#3
برای صفرکردن سریع از کد زیر استفاده میکنیم:

کد:
a=[1,2,3;4,5,6;7,8,9];
a(a<4)=0;
دوست دارم زندگی رو . . . 
پاسخ
 سپاس شده توسط admin

صفرکردن شرطی درایه های یک ماتریس به صورت سریع

#4
(۱۳۹۲/۰۸/۰۵, ۰۱:۵۴ ب.ظ)'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.

با مقایسه، متوجه می شویم که روش شما سریعتر عمل میکنه. ممنون. 
 
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

صفرکردن شرطی درایه های یک ماتریس به صورت سریع

#5
تست این کد وقتی الگوریتم سنگین بنویسید حس میشه ، کد من با دو حلقه for برای صفرکردن ماتریس یک ساعت طول میکشید و با روشی که نوشتم 10 دقیقه شد!!!!!
دوست دارم زندگی رو . . . 
پاسخ


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان

آخرین کلیدهای غیررایگان

شما هم می توانید کلیدهای غیررایگان منتشر کنید (بیشتر بدانید)