উদাহরণস্বরূপ, v + 1
আপনি ভেক্টরের প্রতিটি আইটেমটিতে কোনও ফাংশন প্রয়োগ করতে পারেন , বা আপনি এই ফাংশনটি ব্যবহার করতে পারেন arrayfun
। লুপের জন্য ব্যবহার না করে আমি কীভাবে ম্যাট্রিক্সের প্রতিটি সারি / কলামের জন্য এটি করতে পারি?
উদাহরণস্বরূপ, v + 1
আপনি ভেক্টরের প্রতিটি আইটেমটিতে কোনও ফাংশন প্রয়োগ করতে পারেন , বা আপনি এই ফাংশনটি ব্যবহার করতে পারেন arrayfun
। লুপের জন্য ব্যবহার না করে আমি কীভাবে ম্যাট্রিক্সের প্রতিটি সারি / কলামের জন্য এটি করতে পারি?
উত্তর:
অনেক বিল্ট-ইন মত অপারেশন sum
এবং prod
ইতিমধ্যে সারি বা কলাম জুড়ে কাজ চালানোর জন্য, যাতে আপনি ফাংশন আপনি এই সুবিধা গ্রহণ করতে আবেদন করেন refactor করতে সক্ষম হতে পারে পারবেন।
যদি এটি কোনও ব্যবহারযোগ্য বিকল্প না হয়, তবে এটির একটি উপায় হ'ল সারি বা কলামগুলি সেলগুলিতে ব্যবহার করে mat2cell
বা num2cell
এরপরে cellfun
ফলস্বরূপ সেল অ্যারে চালানোর জন্য ব্যবহার করুন।
উদাহরণ হিসাবে, ধরা যাক আপনি একটি ম্যাট্রিক্সের কলামগুলি যোগ করতে চান M
। আপনি কেবল এটি ব্যবহার করে করতে পারেন sum
:
M = magic(10); %# A 10-by-10 matrix
columnSums = sum(M, 1); %# A 1-by-10 vector of sums for each column
এবং এখানে আপনি আরও জটিল num2cell
/ cellfun
বিকল্প ব্যবহার করে এটি করবেন :
M = magic(10); %# A 10-by-10 matrix
C = num2cell(M, 1); %# Collect the columns into cells
columnSums = cellfun(@sum, C); %# A 1-by-10 vector of sums for each cell
true = false
বৈধ বক্তব্য আছে, আমি নিশ্চিত যে আপনি এটি করতে পারেন এমন একটি উপায় রয়েছে (:
sum(M, 1)
। প্রাথমিকভাবে মনে করা sum
যেতে পারে স্বেচ্ছাচারিত আকারের ম্যাট্রিক্সের জন্য এভাবে ব্যবহার করা যেতে পারে এবং ম্যাট্রিক্স একদিন হলে স্টাম্পড হয়ে যায় 1-by-n
।
আপনি আরও অস্পষ্ট মতলব ফাংশন বিএসএক্সফুন চাইতে পারেন । মতলব ডকুমেন্টেশন থেকে, বিএসএক্সফুন "ফাংশন হ্যান্ডেল মজাদার দ্বারা নির্দিষ্ট করা এলিমি বাই-এলিমেন্ট বাইনারি অপারেশন প্রয়োগ করে অ্যারে এবং এ বিতে, সিঙ্গেলটন প্রসারণ সক্ষম করেছে।"
@ উপবৃত্তির উপরে উল্লিখিত হয়েছে যে যোগফল এবং অন্যান্য মৌলিক ফাংশনগুলি ইতিমধ্যে প্রথম অ-সিঙ্গলটন মাত্রায় (যেমন, সারিগুলি একাধিক সারি থাকলে, কলামগুলিতে কেবল একটি সারি রয়েছে, বা নিম্ন মাত্রার সমস্ত আকার == 1 থাকলে উচ্চতর মাত্রা) )। তবে, বিএসএক্সফুন (এবং বিশেষত) ব্যবহারকারী-সংজ্ঞায়িত ফাংশন সহ যে কোনও ফাংশনের জন্য কাজ করে।
উদাহরণস্বরূপ, আসুন আমরা বলি যে আপনার কাছে একটি ম্যাট্রিক্স এ এবং একটি সারি ভেক্টর বিগ রয়েছে, আসুন বলি:
A = [1 2 3;
4 5 6;
7 8 9]
B = [0 1 2]
আপনি একটি ফাংশন পাওয়ার_বাই_কোল চাই যা একটি ভেক্টর সিতে A এর সমস্ত উপাদান বি এর সাথে সম্পর্কিত কলামের পাওয়ারে ফিরে আসে
উপরের উদাহরণ থেকে সি একটি 3x3 ম্যাট্রিক্স:
C = [1^0 2^1 3^2;
4^0 5^1 6^2;
7^0 8^1 9^2]
অর্থাত,
C = [1 2 9;
1 5 36;
1 8 81]
আপনি repmat ব্যবহার করে এই নিষ্ঠুর শক্তি উপায়ে করতে পারেন:
C = A.^repmat(B, size(A, 1), 1)
অথবা আপনি বিএসএক্সফুন ব্যবহার করে উত্কৃষ্ট পদ্ধতিতে এটি করতে পারেন যা অভ্যন্তরীণভাবে পুনর্নির্মাণের পদক্ষেপের যত্ন নেয়:
C = bsxfun(@(x,y) x.^y, A, B)
সুতরাং বিএসএক্সফুন আপনাকে কয়েকটি পদক্ষেপগুলি সংরক্ষণ করে (আপনার স্পষ্টভাবে এ এর মাত্রাগুলি গণনা করার দরকার নেই)। তবে, আমার কিছু অনানুষ্ঠানিক পরীক্ষায় দেখা গেছে যে ফাংশনটি প্রয়োগ করতে হলে (উপরে আমার পাওয়ার ফাংশনটির মতো) সহজ হলে রিপ্যাট প্রায় দ্বিগুণ দ্রুত হয়। সুতরাং আপনি সরলতা বা গতি চান কিনা তা চয়ন করতে হবে।
এটি কতটা দক্ষ তা নিয়ে আমি মন্তব্য করতে পারি না, তবে এখানে একটি সমাধান রয়েছে:
applyToGivenRow = @(func, matrix) @(row) func(matrix(row, :))
applyToRows = @(func, matrix) arrayfun(applyToGivenRow(func, matrix), 1:size(matrix,1))'
% Example
myMx = [1 2 3; 4 5 6; 7 8 9];
myFunc = @sum;
applyToRows(myFunc, myMx)
অ্যালেক্সের উত্তরে বিল্ডিং , এখানে আরও জেনেরিক ফাংশন রয়েছে:
applyToGivenRow = @(func, matrix) @(row) func(matrix(row, :));
newApplyToRows = @(func, matrix) arrayfun(applyToGivenRow(func, matrix), 1:size(matrix,1), 'UniformOutput', false)';
takeAll = @(x) reshape([x{:}], size(x{1},2), size(x,1))';
genericApplyToRows = @(func, matrix) takeAll(newApplyToRows(func, matrix));
এখানে দুটি ফাংশনের মধ্যে একটি তুলনা করা হল:
>> % Example
myMx = [1 2 3; 4 5 6; 7 8 9];
myFunc = @(x) [mean(x), std(x), sum(x), length(x)];
>> genericApplyToRows(myFunc, myMx)
ans =
2 1 6 3
5 1 15 3
8 1 24 3
>> applyToRows(myFunc, myMx)
??? Error using ==> arrayfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.
Error in ==> @(func,matrix)arrayfun(applyToGivenRow(func,matrix),1:size(matrix,1))'
পরিপূর্ণতা / আগ্রহের জন্য আমি যোগ করতে চাই যে মাতলাব একটি ফাংশন রয়েছে যা আপনাকে প্রতি উপাদানটির পরিবর্তে প্রতি সারি ডেটাতে কাজ করতে দেয়। একে rowfun
( http://www.mathworks.se/help/matlab/ref/rowfun.html ) বলা হয় তবে কেবল "সমস্যা" হ'ল এটি টেবিলগুলিতে কাজ করে ( http://www.mathworks.se/help/ মতলব / ref & / table.html ) বদলে ম্যাট্রিক্স ।
এই প্রশ্নের উত্তরের ক্রমবর্ধমান প্রকৃতির সাথে যুক্ত করে, আর -2016 বি দিয়ে শুরু করে, ম্যাটল্যাব স্পষ্টতই সিঙ্গেলটন মাত্রা প্রসারিত করবে, bsxfun
অনেক ক্ষেত্রে প্রয়োজনীয়তা সরিয়ে ফেলবে ।
থেকে r2016b রিলিজ নোট :
অন্তর্ভুক্ত সম্প্রসারণ: দৈর্ঘ্য 1 এর মাত্রার স্বয়ংক্রিয়ভাবে বিস্তৃতকরণের সাথে অ্যারেগুলিতে উপাদান-ভিত্তিক ক্রিয়াকলাপ এবং কার্যগুলি প্রয়োগ করুন
অন্তর্নিহিত সম্প্রসারণ স্কেলার প্রসারণের একটি সাধারণীকরণ। স্কেলার সম্প্রসারণের সাথে, স্কেলার উপাদান-ভিত্তিক ক্রিয়াকলাপগুলির সুবিধার্থে অন্য অ্যারে হিসাবে একই আকারে প্রসারিত হয়। অন্তর্নিহিত প্রসারণের সাথে, এখানে তালিকাভুক্ত উপাদান-ভিত্তিক অপারেটর এবং ফাংশনগুলি সুস্পষ্টভাবে তাদের ইনপুটগুলি একই আকার হিসাবে প্রসারিত করতে পারে, যতক্ষণ না অ্যারেগুলির সাথে সামঞ্জস্যপূর্ণ আকার থাকে। দুটি অ্যারে সুসংগত মাপযুক্ত থাকে যদি প্রতিটি মাত্রার জন্য, ইনপুটগুলির ডাইমেনশন আকারগুলি হয় একই হয় বা তার মধ্যে একটি হয় ১. আরও তথ্যের জন্য বেসিক অপারেশন এবং অ্যারে বনাম ম্যাট্রিক্স অপারেশনগুলির জন্য সামঞ্জস্যপূর্ণ অ্যারে আকারগুলি দেখুন।
Element-wise arithmetic operators — +, -, .*, .^, ./, .\ Relational operators — <, <=, >, >=, ==, ~= Logical operators — &, |, xor Bit-wise functions — bitand, bitor, bitxor Elementary math functions — max, min, mod, rem, hypot, atan2, atan2d
উদাহরণস্বরূপ, আপনি ম্যাট্রিক্স এতে প্রতিটি কলামের গড় গণনা করতে পারেন, এবং তারপরে প্রতিটি কলাম থেকে গড় মানগুলির ভেক্টরকে A - গড় (এ) দিয়ে বিয়োগ করতে পারেন।
পূর্বে, এই কার্যকারিতাটি বিএসএক্সফুন ফাংশনের মাধ্যমে উপলব্ধ ছিল। এখনই আপনি বিএসএক্সফুনের বেশিরভাগ ব্যবহারগুলি ফাংশন এবং অপারেটরগুলিকে সরাসরি কল সহ প্রতিস্থাপন করবেন যা অন্তর্নিহিত প্রসারণ সমর্থন করে। বিএসএক্সফুন ব্যবহারের তুলনায়, অন্তর্নিহিত সম্প্রসারণ দ্রুত গতি, আরও ভাল মেমরির ব্যবহার এবং কোডের উন্নত পাঠযোগ্যতা সরবরাহ করে।
উপরের উত্তরগুলির মধ্যে আমার পক্ষে "বাক্সের বাইরে" কাজ হয়নি, তবে অন্যান্য উত্তরের ধারণাগুলি অনুলিপি করে নিম্নলিখিত ফাংশনটি কার্যকর করেছে:
apply_func_2_cols = @(f,M) cell2mat(cellfun(f,num2cell(M,1), 'UniformOutput',0));
এটি একটি ফাংশন নেয় f
এবং ম্যাট্রিক্সের প্রতিটি কলামে এটি প্রয়োগ করেM
।
উদাহরণস্বরূপ:
f = @(v) [0 1;1 0]*v + [0 0.1]';
apply_func_2_cols(f,[0 0 1 1;0 1 0 1])
ans =
0.00000 1.00000 0.00000 1.00000
0.10000 0.10000 1.10000 1.10000
মতলবের সাম্প্রতিক সংস্করণগুলির সাথে, আপনি আপনার সুবিধার জন্য সারণী ডেটা কাঠামোটি ব্যবহার করতে পারেন। এমনকি একটি 'রোউফান' অপারেশন রয়েছে তবে আমি এটি করা সহজ করে দেখলাম:
a = magic(6);
incrementRow = cell2mat(cellfun(@(x) x+1,table2cell(table(a)),'UniformOutput',0))
বা পুরানো মতলব সংস্করণগুলির জন্য আমার কাছে এমন একটি পুরোনো রয়েছে যা টেবিলের প্রয়োজন নেই।
dataBinner = cell2mat(arrayfun(@(x) Binner(a(x,:),2)',1:size(a,1),'UniformOutput',0)')
গৃহীত উত্তরটি মনে হয় প্রথমে কোষে রূপান্তর করা হবে এবং তারপরে cellfun
সমস্ত কক্ষকে পরিচালনা করতে ব্যবহার করা হবে। আমি নির্দিষ্ট অ্যাপ্লিকেশনটি জানি না, তবে সাধারণভাবে আমি bsxfun
ম্যাট্রিক্সের উপরে কাজ করতে আরও দক্ষ হবে বলে মনে করব । মূলত bsxfun
দুটি অ্যারে জুড়ে একটি অপারেশন উপাদান দ্বারা উপাদান প্রয়োগ করে। সুতরাং আপনি যদি অ্যারে পেতে ভেক্টরের n x 1
প্রতিটি আইটেম দ্বারা ভেক্টরের প্রতিটি আইটেমকে গুণতে চান, আপনি এটি ব্যবহার করতে পারেন:m x 1
n x m
vec1 = [ stuff ]; % n x 1 vector
vec2 = [ stuff ]; % m x 1 vector
result = bsxfun('times', vec1.', vec2);
এটি আপনাকে বলা ম্যাট্রিক্স দেবে result
যেখানে (i, j) এন্ট্রি হবে vec1
এর jth এলিমেন্টের দ্বারা গুণিত ith উপাদান vec2
।
আপনি bsxfun
বিল্ট-ইন ফাংশনগুলির জন্য ব্যবহার করতে পারেন এবং আপনি নিজের ঘোষণা করতে পারেন declare ডকুমেন্টেশনে অনেকগুলি অন্তর্নির্মিত ফাংশনগুলির একটি তালিকা রয়েছে তবে মূলত আপনি যে কোনও ফাংশনকে দুটি অ্যারে (ভেক্টর বা ম্যাট্রিক্স) আর্গুমেন্ট হিসাবে গ্রহণ করে এবং এটি কাজ করতে পারেন তার নাম রাখতে পারেন।
কীভাবে একটি ম্যাট্রিক্সের সারি অঙ্কগুলি গণনা করতে হবে তা সন্ধান করার সময় এই প্রশ্ন / উত্তরকে স্তম্ভিত করে।
আমি কেবল এটি যুক্ত করতে চাই যে মতলবের এসইউএম ফাংশনটিতে একটি নির্দিষ্ট মাত্রার জন্য যোগফলের পক্ষে সমর্থন রয়েছে, অর্থাত্ দুটি মাত্রা সহ একটি স্ট্যান্ডার্ড ম্যাট্রিক্স।
সুতরাং কলামের অঙ্কগুলি গণনা করতে হবে:
colsum = sum(M) % or sum(M, 1)
এবং সারির অঙ্কের জন্য, সহজভাবে করুন
rowsum = sum(M, 2)
আমার বাজি হ'ল এটি লুপের জন্য প্রোগ্রামিং এবং কোষে রূপান্তরকরণ উভয়ের চেয়ে দ্রুত is
এই সবগুলি SUM এর জন্য ম্যাটল্যাব সহায়তাতে পাওয়া যাবে।
আপনি যদি আপনার সারিগুলির দৈর্ঘ্য জানেন তবে আপনি এই জাতীয় কিছু তৈরি করতে পারেন:
a=rand(9,3);
b=rand(9,3);
arrayfun(@(x1,x2,y1,y2,z1,z2) line([x1,x2],[y1,y2],[z1,z2]) , a(:,1),b(:,1),a(:,2),b(:,2),a(:,3),b(:,3) )