من یه ماتریس دارم به ابعاد 70 در 10 . چطوری میتونم یه ماتریس تصادفی با ابعاد 35 در 10 از این ماتریس درست کنم در صورتی که سطرهای شبیه به هم نداشته باشن؟
تشکر
Printable View
من یه ماتریس دارم به ابعاد 70 در 10 . چطوری میتونم یه ماتریس تصادفی با ابعاد 35 در 10 از این ماتریس درست کنم در صورتی که سطرهای شبیه به هم نداشته باشن؟
تشکر
بسته به این داره که آیا تعداد سطرهای یکتا در ماتریس اول بیشتر از 35 تا هست یا نه که اگه باشه به این صورت ماتریس c با 35 سطر تشکیل میشه
a=rand(70,10);
b=unique(a,'rows');
c=b(randperm(35),:);
ممنونم از کمکت.
بله همه ی سطرها و ستون ها یکتا هستن. شبیه به هم نداره. آیا باز نیازه که سطر دوم برنامه نوشته بشه؟
ببین اصل سوال من دو قسمتیه. به این صورت :
من یه ماتریس دارم به ابعاد 70 در 12 . چطوری میتونم یه ماتریس تصادفی با ابعاد 35 در 7 از این ماتریس(اصلی) درست کنم در صورتی که سطرها و ستون های شبیه به هم نداشته باشن؟
و بقیه سطر و ستون در یک ماتریس دیگه قرار بگیرن که میشه ماتریسی به ابعاد 35 در 5
به فرض اینکه در ماتریس a تمام سطرها یکتا باشن نمیشه ضمانت داد که ماتریسی که از اون استخراج شده باشه تمام سطر هاش یکتا باشه
همچنین اینکه بخواهیم بصورت رندوم از ماتریس انتخاب کنیم منظورتون اینه که از سطرهاش به صورت رندوم انتخاب بشه یا اینکه از تمام عناصرش بتونیم رندوم انتخاب کنیم؟
اگه بخواهیم از سطرها رندوم انتخاب کنیم جواب شما میشه ماتریس b , c
a=rand(70,12);
[~,i1,~]=unique(a(:,1:7),'rows');
[~,i2,~]=unique(a(:,8:12),'rows');
i3=intersect(i1,i2);
i4=i3(randperm(35));
b=a(i4,1:7);
c=a(i4,8:12);
ببین هم سطرها رو رندوم انتخاب کنه هم ستونهاش. الآن شما اینجا ستون رو به دلخواه انتخاب کردین!
مثلاً سطرهای 5 و 6 و 12 و 15 و ... تا 35 تا
و ستون های 2 و 8 و 10 و 20 و ... تا 7 تا
اینا در یک ماتریس قرار بگیرن و بقیه ی سطرها و ستون هایی که استفاده نشدن (که شامل 35 سطر و 5 ستون هست) در ماتریس دیگه ای قرار بگیرن.
رد ضمن ، این برنامه رو که اجرا کردم این پیغام رو داد. در صورتی که پرانتز یا کروشه ای اضافه باز نشده!
Expression or statement is incorrect--possibly unbalanced (, {, or [.
این یکی هم سطر و هم ستون را تصادفی انتخاب می کنه
a=rand(70,12);
i0=randperm(12);
[~,i1,~]=unique(a(:,i0(1:7)),'rows');
[~,i2,~]=unique(a(:,i0(8:12)),'rows');
i3=intersect(i1,i2);
i4=randperm(35);
i5=i3(i4);
b=a(i5,i0(1:7));
c=a(i5,i0(8:12));
این جور درست میشه؟
a=rand(70,12);
i0=randperm(12);
i01=i0(1:7);
i02=i0(8:12);
a1=a(:,i01);
a2=a(:,i02);
[~,i1,~]=unique(a1,'rows');
[~,i2,~]=unique(a2,'rows');
i3=intersect(i1,i2);
i4=randperm(35);
i5=i3(i4);
b=a(i5,i01);
c=a(i5,i02);
نه متاسفانه.
خط شماره 8 :
[~,i1,~]=unique(a1,'rows');
اینو ارور میده. میگه پرانتز یا کروشه کم و زیاد گذاشتی. توازن نداره. روی متلب شما جواب میده؟
در ضمن. درسته که شما ستونها رو باز رندوم کردین ولی من بعداً هی باید تعداد ستون ها رو تغییر بدم. یعنی در حلقه for قرار بدم که یه بار با 5 ستونه یه بار با 10 ستونه و ... انجام بده. اینطوری شما آزادی عمل رو از من گرفتین.
پیفام خطا رو چیکار کنم؟
فکر کنم نسخه متلب شما از 2009 به پایین هست که علامت ~ را قبول نمی کنه
a=rand(70,12);
i0=randperm(12);
[ii,i1,jj]=unique(a(:,i0(1:7)),'rows');
[ii,i2,jj]=unique(a(:,i0(8:12)),'rows');
i3=intersect(i1,i2);
i4=randperm(35);
i5=i3(i4);
b=a(i5,i0(1:7));
c=a(i5,i0(8:12));
دقیقا متوجه نمیشم منظورتون چیهنقل قول:
در ضمن. درسته که شما ستونها رو باز رندوم کردین ولی من بعداً هی باید تعداد ستون ها رو تغییر بدم. یعنی در حلقه for قرار بدم که یه بار با 5 ستونه یه بار با 10 ستونه و ... انجام بده. اینطوری شما آزادی عمل رو از من گرفتین
منم همین حدس رو زدم که این علامت رو نشناسه. نسخه متلب من R2009a ورژن 7.8.0 هست ولی پایینتر که نیس نشناسه.
معادلی نداره؟ NAN گذاشتم نشد!
ببین منظورم اینه که این دو ماتریسی که قراره ساخته بشه بعداً باید در یک حلقه for قرار بگیره تا 10 بار از این ماتریسا بسازه که هر بار تعداد ستون هاش تغییر میکنه.
مثلاً بار اول دوتا ماتریس ساخت با ابعاد 35 در 7 و 35 در 5
بار دوم دو ماتریس با ابعاد 35 در 4 و 35 در 8
بار سوم دو ماتریس 35 در 6 و 35 در 6
و ...
تا 10 بار انجام بده.
هر بار که میسازه سطرها و ستونها باید تصادفی انتخاب بشه و تعداد سطرها ثابت هست ولی تعداد ستونها تغییر میکنه!
اگه نتونستم منظورمو برسونم یه آدرس ایمل بده تا روی کاغذ برات پیاده سازی کنم.
مرسی از راهنمایی و کمکت.
یک تابع به نام myfun درست می کنیم و تعداد ستون b را به اون می دهیم تا هم b ایجاد بشه و هم c
function [b,c]= myfun(a,bcols)
i0=randperm(cols(a));
[ii,i1,jj]=unique(a(:,i0(1:bcols)),'rows');
[ii,i2,jj]=unique(a(:,i0(bcols+1:cols(a))),'rows');
i3=intersect(i1,i2);
i5=i3(randperm(35));
b=a(i5,i0(1:bcols));
c=a(i5,i0(bcols+1:cols(a)));
end
a=rand(70,12);
[b,c]=myfun(a,7);
[ii,i1,jj]=unique(a(:,i0(1:7)),'rows');
دستور بالا میاد از ماتریس a یک ماتریس استخراج می کنه به این صورت که هفت تا ستون را تصادفی انتخاب می کنه و همچنین سطرهای این ماتریس هفت ستونی یکتا باشن . بعد هم میاد اندکس اون سطرهایی از ماتریس a که شامل این سطرهای جدید میشن را استخراج می کنه. یعنی i1 اندکس سطرهای استخراج شده در ماتریس a هست
[ii,i2,jj]=unique(a(:,i0(8:12)),'rows');
این هم که در مورد ماتریس با 5 ستون اعمال میشه دقیقا مثل قبلی
i3=intersect(i1,i2);
اینجا عناصر مشترک بین دو اندکس را پیدا می کنیم چون ممکنه مثلا تعداد سطرهای یکتا در یکی زیاد تر از اون یکی باشه
اگه تعداد ستون b و c مساوی باشه ممکنه سطرهای مشابه پیدا کنن
با این یکی مشکل برطرف میشه:
function [b,c]= myfun(a,bcols)
cols=@(x) columns(x);
i1=0;i3=0;
i0=randperm(cols(a));
if (bcols==(cols(a)-bcols))
[ii,i1,jj]=unique([a(:,i0(1:bcols));a(:,i0(bcols+1:cols(a)))],'rows');
i3=intersect(i1(i1<=35),i1(i1>35)-35);
else
[ii,i1,jj]=unique(a(:,i0(1:bcols)),'rows');
[ii,i2,jj]=unique(a(:,i0(bcols+1:cols(a))),'rows');
i3=intersect(i1,i2);
end
i5=i3(randperm(35));
b=a(i5,i0(1:bcols));
c=a(i5,i0(bcols+1:cols(a)));
end
a=rand(70,12);
[b,c]=myfun(a,6);
معذرت میخوام. من یه جارو اشتباه گفتم.
هر بار که این دو ماتریس رو میسازه تعداد ستونهای دو ماتریس باید برابر و شبیه هم باشه. یعنی اگه در ماتریس b از ستون های 1 و 4 و 7 و 10 استفاده شد ، باید در ماتریس c هم همین ستونها استفاده بشه. ولی سطرهای اونها متفاوته.
و این عمل باید 10 بار تکرار بشه با ستونهای مختلف.
من فکر کنم اینطوری منظور منو متوجه نمیشی!
میشه آدرس ایمیل خودتو توی پیام خصوصی برام بذاری تا من توی برگه مشخص کنم.
تشکر
function [a,b]= myfun(X,ncols)
i0=0;i1=0;
while( rows(i1)!=163)
i0=randperm(cols(X),ncols);
i1=unique(X(:,i0),'rows');
end
i2=randperm(163);
a=X(i2(1:98),i0);
b=X(i2(99:163),i0);
end
X=rand(163,43);
for i=[5:5:35,43]
[a,b]=myfun(X,i);
end
ممنونم.
روی خط سوم برنامه ، برای علامت تعجب (!) خطا میده. منظور از این علامت چیه؟ میشه بجاش =~ گذاشت؟ اینو میذارم خطا نمیده.
در ضمن ، یه پیغام دیگه در خط 11 میده. این پیغام :??? Error: File: myfun.m Line: 11 Column: 1
This statement is not inside any function.
(It follows the END that terminates the definition of the function "myfun".)
=~ درسته همین را بذارید
بعد از اتمام تابع هم می تونید اون دستورات را از توی فایل بردارید و در خط فرمان اجرا کنید و یا اینکه نام فایل را تغییر بدید
ببین من فعلاً خط 10 به بعد رو حذف کردم تا فقط یک تابع داشته باشم. بصورت زیر :function [a,b]= myfun(X,ncols)
i0=0;i1=0;
while( rows(i1)~=163)
i0=randperm(cols(X),ncols);
i1=unique(X(:,i0),'rows');
end
i2=randperm(163);
a=X(i2(1:98),i0);
b=X(i2(99:163),i0);
end
حالا اینو اجرا میکنم پیغام زیر رو میده :??? Undefined function or method 'rows' for input arguments of type 'double'.
Error in ==> myfun at 3
while( rows(i1)~=163)
شما چطوری برنامه متلب رو اینجا قرار میدی که شبیه خود محیط متلب میوفته؟
من دستورات رو اینجا میذارم سمت راست قرا میگیره! :)
از این استفاده کن ببین درست میشه
کد ها را داخل تگ بذار
همون دکمه ها که روی اونها نوشته C++ یا vb
من داخل تگ VB میذارم
function [a,b]= myfun(X,ncols)
i0=0;i1=0;
while( numel(i1)~=163)
i0=randperm(cols(X),ncols);
[ii,i1,jj]=unique(X(:,i0),'rows');
end
i2=randperm(163);
a=X(i2(1:98),i0);
b=X(i2(99:163),i0);
end
X=rand(163,43);
for i=[5:5:35,43]
[a,b]=myfun(X,i);
end
من اینو اجرا کردم ولی میگه X رو نمیشناسه.
function [a,b]= myfun(X,ncols)
i0=0;i1=0;
while( numel(i1)~=163)
i0=randperm(cols(X),ncols);
[ii,i1,jj]=unique(X(:,i0),'rows');
end
i2=randperm(163);
a=X(i2(1:98),i0);
b=X(i2(99:163),i0);
end
خب وقتی X رو بعد از تابع معرفی کنیم ولی متغیر X رو توی تابع بکار ببریم اینطوری نمیشه؟
با متلب توی اون فولدر برید که این فایل هست
بعد این دستورها را بزنید
X=rand(163,43);
for i=[5:5:35,43]
[a,b]=myfun(X,i);
end
توی متلب شما این خطاها رو نمیده یعنی؟
شاید یک متغیر با نام X قبلا درست کردید
یا متلب را کلا ببندید و باز کنید یا این دستور را بزنید
clear all
من یه فولدر ساختم که توش یه فایل به اسم myfun هست که محتواش اینه :
function [a,b]= myfun(X,ncols)
i0=0;i1=0;
while( numel(i1)~=163)
i0=randperm(cols(X),ncols);
[ii,i1,jj]=unique(X(:,i0),'rows');
end
i2=randperm(163);
a=X(i2(1:98),i0);
b=X(i2(99:163),i0);
end
و یه فایل دیگه به اسم randmat گذاشتم که محتواش اینه :
X=rand(163,43);
for i=[5:5:35,43]
[a,b]=myfun(X,i)
end
وقتی برنامه دوم رو اجرا میکنم بصورت زیر خطا میده :
??? Undefined function or method 'cols' for input arguments of type 'double'.
Error in ==> myfun at 4
i0=randperm(cols(X),ncols);
Error in ==> randmat at 3
[a,b]=myfun(X,i)
این دستور را در خط فرمان متلب کپی و پیست کنید
X=rand(163,43);
for i=[5:5:35,43]
[a,b]=myfun(X,i);
end
یعنی در خط چهارم برنامه myfun کلمه cols باید مثل rows ، عبارت numel قرار بگیره؟
عبارتی که کپی و پیست کردید اجرا شد؟
این دستور چه جوابی میده؟
X=rand(163,43);
cols(X)
فکر کنم در وتلب شما دستور cols وجود نداره
این را امتحان کنید
function [a,b]= myfun(X,ncols)
cols=@(xx) size(xx,2);
i0=0;i1=0;
while( numel(i1)~=163)
i0=randperm(cols(X));
[ii,i1,jj]=unique(X(:,i0(1:ncols)),'rows');
end
i2=randperm(163);
a=X(i2(1:98),i0);
b=X(i2(99:163),i0);
end
خب آقای مهندس. فعلاً اینو جواب داد و خطا نداد.
حالا این ماتریسهایی که ساخت رو نمیشه اندیس گذاشت؟ چون هر بار که درست میکنه میگه a , b !
بعد یه سوال؟
چطوری میشه تشخیص داد که هر بار که ماتریس a,b میسازه مشخص کنیم هیچ سطر مشابهی ندارن؟
یا dataset1 و dataset2 ماتریس شبیه به هم ندارن؟
راستی ، این فقط ماتریس آخری که با 43 تا ستون داره رو ایجاد میکنه. پس ماتریس هایی با ستونهای 5 و 10 و 15 و 20 و .... چی؟
فکر کنم باید اندیس براش گذاشته بشه. درسته؟ چون اینطوری فقط آخرین ماتریس a,b رو نشون میده!
یه اشتباهی در کد بالا شد که درست کردم
اینکه در حلقه for مقادیر قبلی چه طور میشن بستگی به استفاده شما داره
اما اگه می خواهید ذخیره کنید میتونید در سلول ذخیره کنید مثل این:
k=0;
function [a,b]= myfun(X,ncols)
cols=@(xx) size(xx,2);
i0=0;i1=0;
while( numel(i1)~=163)
i0=randperm(cols(X))(1:ncols);
[ii,i1,jj]=unique(X(:,i0),'rows');
end
i2=randperm(163);
a=X(i2(1:98),i0);
b=X(i2(99:163),i0);
end
celldata={}
j=1
X=rand(163,43);
for i=[5:5:35,43]
[a,b]=myfun(X,i);
celldata{j}={a,b};
j=j+1;
end
مقادیر هم یکتا هستند و مشکلی نیست