PDA

View Full Version : راهنمایی



bporreza
شنبه 27 تیر 1394, 18:51 عصر
باسلام و خسته نباشید.لطفا راهنمایی کنید چطور میتونم 1ماتریس قطری بلوکی ایجاد کنم که هر بلوکش سطری از یک ماتریس دیگه هست.و اینکه چطور میتونم 1ماتریس رو روی قطر یک ماتریس قطری بلوکی بذارم.وقتی از دستور blkdiag استفاده میکنم فقط 1بار میذاره روقطر

rahnema1
شنبه 27 تیر 1394, 23:55 عصر
سلام
می تونید از تابع زیر استفاده کنید

function Mdiag = blockDiagonal(M)
Mdiag = padarray(M(1:end - 1, :)', numel(M), 0, 'post');
Mdiag = [Mdiag(:); M(end, :)'];
Mdiag = reshape(Mdiag, numel(M), size(M, 1))';
end

مثلا یک ماتریس به نام M داریم به صورت زیر تبدیل می شه

M = rand(3, 5);
M2 = blockDiagonal(M);

حالا میخواهیم اندیس بلوکهای اون را در بیاریم که به جای اون یه ماتریس دیگه به نام N بذاریم

N = rand(3, 5);
indexdiag = blockDiagonal(ones(size(M)));
M2(logical(indexdiag)) = N;

bporreza
یک شنبه 28 تیر 1394, 03:31 صبح
ممنون از راهنماییتون.این کدها ارور میده متاسفانه.فک کنم منظورم رو درست نرسوندم.عکسی میفرستم.در واقع میخوام ماتریسهایDبارAبارTبار رو بدست بیارم.که D, T ,A معلوم هستن.

bporreza
یک شنبه 28 تیر 1394, 03:42 صبح
133401عکس رو دوباره فرستادم

rahnema1
یک شنبه 28 تیر 1394, 22:49 عصر
فایل ضمیمه مثل اینکه درست آپلود نشده
حالا اشکال این کد کجاست و چه اروری میده
اگه حجم ماتریس زیاد باشه لازمه از ماتریس sparse استفاده کنید مثل این:

function Mdiag = blockDiagonal(M)
M = sparse(M);
Mdiag = padarray(M(1:end - 1, :)', numel(M), 0, 'post');
Mdiag = [Mdiag(:); M(end, :)'];
Mdiag = reshape(Mdiag, numel(M), size(M, 1))';
end


این تابع را به یه شکل دیگه هم نوشتم که فکر کنم بهتر باشه

function Mdiag = blockDiagonal(M)
sz = size(M); elems= numel(M);
Mdiag = spalloc(sz(1), elems, elems);
Mdiag(sub2ind([sz(1), elems], ceil((1:elems) / sz(2)), 1:elems)) = M';
end

bporreza
دوشنبه 29 تیر 1394, 00:53 صبح
Error: File: Untitled.m Line: 3 Column: 1
Function definitions are not permitted in this context.
این اروریه که میده.برای هر دو کد همین ارور رو میده.

rahnema1
دوشنبه 29 تیر 1394, 22:39 عصر
معمولا کسانی که برای اولین بار با متلب کار می کنند دچار این مشکل می شوند
توی متلب تابع باید در فایل جدا باشه
یک فایل درست کنید به نام blockDiagonal.m و آن را داخل یک فولدر ذخیره کنید
در فایل دستور زیر را کپی کنید

function Mdiag = blockDiagonal(M)
sz = size(M); elems= numel(M);
Mdiag = spalloc(sz(1), elems, elems);
Mdiag(sub2ind([sz(1), elems], ceil((1:elems) / sz(2)), 1:elems)) = M';
end

بعد مسیر جاری متلب را همون فولدر بذارید
و از این تابع به صورتی که در بالا گفته شد استفاده کنید

bporreza
سه شنبه 30 تیر 1394, 00:16 صبح
خیلی ممنون.و متشکر.راهنماییتون خیلی مفید بود.حق با شماست من مقدماتی متلب کار میکنم در حد رفع نیاز

bporreza
سه شنبه 30 تیر 1394, 02:57 صبح
اگه امکانش هست لطفا راهنمایی کنید ماتریس قطری بلوکی رو چطور ایجاد کنم؟؟

rahnema1
سه شنبه 30 تیر 1394, 21:15 عصر
اگه امکانش هست لطفا راهنمایی کنید ماتریس قطری بلوکی رو چطور ایجاد کنم؟؟

لطفا یک مثال عددی بزنید و یک ماتریس کوچک به عنوان مثال اینجا بذارید که مشخص بشه دقیقا چیکار می خواهید بکنید

bporreza
چهارشنبه 31 تیر 1394, 02:58 صبح
N=input('N=');
for i=0:N
for j=0:N
if i<=j
w=(-1)^(j-i)*nchoosek(N,i);
z=nchoosek(N-i,j-i);
D(i+1,j+1)=w*z;
else
end
end
end
D
ماتریس D را به ازای Nهای متفاوت داریم و می خواهیم ماتریس Dبار در تصویر بالا را ایجاد کنیم

rahnema1
چهارشنبه 31 تیر 1394, 15:36 عصر
تابع زیر را در یک فایل با همین نام قرار دهید

function Mdiag = eyeBlock(N)
elems = N ^ 2;
Mdiag = zeros(N, elems);
Mdiag(sub2ind([N, elems], ceil((1:elems) / N), 1:elems)) = 1;
Mdiag = Mdiag' * Mdiag ;
end

بعد هم با فرض اینکه D را داریم به این صورت استفاده کنید:

D_bar = eyeBlock(N);
D_bar(find(D_bar)) = repmat(D, 1, N);

bporreza
چهارشنبه 31 تیر 1394, 17:02 عصر
بسیار ممنون.لطف کردین.

rahnema1
چهارشنبه 31 تیر 1394, 17:08 عصر
در پایین ماتریس اون شکل نوشته N+1 که فکر کنم باید برنامه اصلاح بشه. نظر شما چیه الان این نتایج با N+1 سازگار هست؟

bporreza
چهارشنبه 31 تیر 1394, 21:16 عصر
بله.درسته.نتایج با N+1 بدست میاد.خود تابع نیاز به اصلاح نداره فقط موقع استفاده از تابع بجای N باید N+1 گذاشت

rahnema1
پنج شنبه 01 مرداد 1394, 03:42 صبح
فکر کنم یه تغییر لازمه داده بشه
اینجا دو تا مقدار داریم یکی سایز بلاک هست و یکی تعداد تکرار بلاک

function Mdiag = eyeBlock(blockSize, numBlocks)
elems = blockSize * numBlocks;
Mdiag = zeros(numBlocks, elems);
Mdiag(sub2ind([numBlocks, elems], ceil((1:elems) / blockSize), 1:elems)) = 1;
Mdiag = Mdiag' * Mdiag ;
end

این هم طرز استفاده

D_bar = eyeBlock(N, N + 1);
D_bar(find(D_bar)) = repmat(D, 1, N + 1);

bporreza
پنج شنبه 01 مرداد 1394, 10:48 صبح
بازهم متشکر.خیلی ممنون.

sim-power
سه شنبه 27 مرداد 1394, 23:17 عصر
ماتریس در متلب (http://sim-power.ir/%D9%85%D8%A7%D8%AA%D8%B1%DB%8C%D8%B3-%D8%AF%D8%B1-%D9%85%D8%AA%D9%84%D8%A8/)
اهمیت ماتریس در متلب از نام‌گذاری متلب که از MAtrix LABoratory گرفته شده است روشن است. اغلب متغیرها ماتریس هستند برای مثال یک عدد معمولی یک ماتریس 1 ×1 است آرایه‌های سطری و ستونی وضعیت مشابهی دارند یک سیگنال صحبت یا یک عکس همه یک ماتریس هستند. یک رشته‌ی متنی یک ماتریس با عناصر کاراکتر است

تعریف ماتریس:
در تعریف ماتریس نکات زیر حائز اهمیت‌اند:


آغاز ماتریس با علامت به راکت باز [
فاصله‌ی عناصر یک سطر باکم او یا فاصله
تفکیک ستون‌ها با سمیکالن
پایان آرایه با علامت به راکت بسته]