کلیدستان

نسخه‌ی کامل: سوال : حذف تصادفی ستون های یک ماتریس
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام ، یک ماتریس 100 ردیف و 500 ستون رو تصور کنید میخواهم ستون های ماتریس رو به صورت اتفاقی حذف کنم ، مثلا 60 درصد ستونها رو میخواهم حذف کنم یعنی 300 ستون را به صورت اتفاقی متلب حذف کنه ، باید چکار کنم ؟
سلام .
برای حذف یک یا چند عنصر از یک ماتریس ، باید آنها را مساوی علامت های [] قرار بدهید . بنابراین برای حذف تمامی عناصر موجود در یک ستون از یک ماتریس ، باید تمامی عناصر مربوط به آن ستون را برابر علامت های [] قرار بدهیم .
مثلا با کدهای زیر ، ابتدا ماتریس A را تعریف کرده و سپس ستون شماره 3 را حذف می کنیم :

کد:
clear all
close all
clc

A=[1 2 3;4 5 6]
A(:,3)=[]

نتیجه اجرای کد متلب بالا :

کد:
A =

     1     2     3
     4     5     6


A =

     1     2
     4     5

خوب حالا میریم سر مسئله اصلی . فرض کنید ماتریس ما دارای تعداد N ردیف و M ستون باشد و ما بخواهیم که L تا از M ستون را به صورت تصادفی حذف کنیم . برای این منظور ، کدهای متلب زیر رو می نویسیم :

کد:
clear all
close all
clc

N=5;
M=10;
L=5;
A=rand(N,M)

for nn=1:L
    a=1;
    b=M-L+1;
    for_delete=round(a+(b-a)*rand(1));
    A(:,for_delete)=[];
end

A

ماتریس A را با اعداد تصافی (توسط دستور rand) ساخته ایم . شماره ستونی که باید حذف شود را در هر بار اجرای حلقه for به صورت تصادفی پیدا می کنیم (با دو دستور rand و round) . عدد مربوط به شماره ستونی که باید حذف شود را در for_delete ذخیره می کنیم . حد پایین تولید عدد تصادفی برابر a و حد بالا برابر b می باشد . دستور round برای گرد کردن اعداد اعشاری به کار می رود . دقت شود که با حذف یک ستون در هر بار اجرای حلقه ، اندازه ماتریس کوچکتر می شود و بنابراین حد بالای تولید عدد تصادفی برای شماره ستونی که باید حذف شود ، به صورت M-L+1 می باشد .
نتیجه اجرای کد متلب بالا :

کد:
A =

    0.2619    0.1068    0.9037    0.0305    0.6099    0.1829    0.1679    0.0596    0.0967    0.6596
    0.3354    0.6538    0.8909    0.7441    0.6177    0.2399    0.9787    0.6820    0.8181    0.5186
    0.6797    0.4942    0.3342    0.5000    0.8594    0.8865    0.7127    0.0424    0.8175    0.9730
    0.1366    0.7791    0.6987    0.4799    0.8055    0.0287    0.5005    0.0714    0.7224    0.6490
    0.7212    0.7150    0.1978    0.9047    0.5767    0.4899    0.4711    0.5216    0.1499    0.8003


A =

    0.1068    0.1829    0.0596    0.0967    0.6596
    0.6538    0.2399    0.6820    0.8181    0.5186
    0.4942    0.8865    0.0424    0.8175    0.9730
    0.7791    0.0287    0.0714    0.7224    0.6490
    0.7150    0.4899    0.5216    0.1499    0.8003

مشاهده می کنید که 5 ستون ماتریس ، به صورت تصادفی ، حذف شده است .
برای مسئله مورد نظرتون ، تنها باید ماتریس A رو تعریف کنید و اعداد مورد نظر خودتون رو در برنامه قرار بدید . coffee
ممنون از جوابتون ولی اینطوری من دسترسی به ستون های حذف شده ندارم ! مسئله من یک مسئله درون یابی هست ماتریس من 101 ردیف و 500 ستون داره که ردیف ها مربوط به زمان و ستون ها معرف گیرنده هایی است که سیگنال را دریافت کرده اند ، من میخواهم 300 تریس را به صورت اتفاقی و رندوم صفر کنه و بعد با الگوریتم های درون یابی داده های اون ستون ها را درون یابی کنم . ماتریس من که داده مصنوعی است و خودم با متلب ساختم آماده ست ولی نمیدونم چطور به متلب بگم مثلا 200 ستون یا 300 ستون رو برام صفر کن و اطلاعاتشون رو از بین ببر ؟ ممنون میشم جوابم رو بدید ، در حال حاضر نیاز بهش دارم ، الگوریتم درون یابی ام تا فردا تموم میشه و باید حتما تستش کنم چون نمیدون الگوریتم رو درست فرمول بندی کردم یا نه و باید حتما ماتریس داده مصنوعی ام رو به صورتی که توضیح دادم صفر اطلاعات کنم تا الگوریتم رو تست کنم . ممنونم
پس به جای اینکه کل ستون رو حذف کنیم ، تمامی عناصر آن را تبدیل به صفر می کنیم . همچنین برداری با نام zero_column می سازیم که در آن شماره ستون هایی که تمام عناصر آن تبدیل به صفر شده اند را در آن بردار ذخیره می کنیم تا بعدا برای مرحله درون یابی بدانیم که کدام ستون ها باید مقدار جدیدشان پیدا شود. کدهای متلب به صورت زیر می باشند :

کد:
clear all
close all
clc

N=5;
M=10;
L=5;
A=rand(N,M)
zero_column=zeros(1,L);

for nn=1:L
    a=1;
    b=M;
    for_zero=round(a+(b-a)*rand(1));
    A(:,for_zero)=0;
    zero_column(1,nn)=for_zero;
end

A
zero_column

نتیجه اجرای کد متلب بالا :

کد:
A =

    0.1206    0.2518    0.9827    0.9063    0.0225    0.4229    0.6999    0.5309    0.9686    0.7788
    0.5895    0.2904    0.7302    0.8797    0.4253    0.0942    0.6385    0.6544    0.5313    0.4235
    0.2262    0.6171    0.3439    0.8178    0.3127    0.5985    0.0336    0.4076    0.3251    0.0908
    0.3846    0.2653    0.5841    0.2607    0.1615    0.4709    0.0688    0.8200    0.1056    0.2665
    0.5830    0.8244    0.1078    0.5944    0.1788    0.6959    0.3196    0.7184    0.6110    0.1537


A =

    0.1206    0.2518    0.9827         0         0         0    0.6999    0.5309         0    0.7788
    0.5895    0.2904    0.7302         0         0         0    0.6385    0.6544         0    0.4235
    0.2262    0.6171    0.3439         0         0         0    0.0336    0.4076         0    0.0908
    0.3846    0.2653    0.5841         0         0         0    0.0688    0.8200         0    0.2665
    0.5830    0.8244    0.1078         0         0         0    0.3196    0.7184         0    0.1537


zero_column =

     4     5     6     5     9

البته ممکنه یک ستون ، چند بار انتخاب بشه که اگر براتون مهم بود باید یک سری شرط بگذارید تا چنین اتفاقی نیفته .
روش دومی هم وجود داره و اون اینه که شماره های تمامی ستون ها رو در یک بردار قرار بدید و سپس تعدادی از اون ها رو به صورت تصادفی حذف کنید و در آخر بر اساس شماره هایی که باقی مونده ، عناصر ستون های مربوط به اون شماره ها رو صفر کنید . با این روش دوم ، دقیقا به تعدادی که می خواهید ، ستون برابر صفر خواهید داشت . coffee