আমি কীভাবে ম্যাটল্যাবে ম্যাট্রিক্সের প্রতিটি সারি / কলামে একটি ফাংশন প্রয়োগ করতে পারি?


106

উদাহরণস্বরূপ, v + 1আপনি ভেক্টরের প্রতিটি আইটেমটিতে কোনও ফাংশন প্রয়োগ করতে পারেন , বা আপনি এই ফাংশনটি ব্যবহার করতে পারেন arrayfun। লুপের জন্য ব্যবহার না করে আমি কীভাবে ম্যাট্রিক্সের প্রতিটি সারি / কলামের জন্য এটি করতে পারি?

উত্তর:


73

অনেক বিল্ট-ইন মত অপারেশন 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

17
আমি সরল ফর-লুপের বিরুদ্ধে কোনও বিশেষ ক্ষেত্রে এই পদ্ধতির পারফরম্যান্স পরীক্ষা করব যা ম্যাট্রিক্সকে সেল অ্যারেতে রূপান্তরিত করার চেয়ে দ্রুত হতে পারে। পরীক্ষার জন্য টিক / ট্যাক মোড়ক ব্যবহার করুন।
ইউক

5
@ ইউক: আমি মনে করি আপনি "টিক / টোক" বোঝাতে চেয়েছিলেন। ;)
gnovice

4
@ জ্ঞানভোজ, সম্ভবত ইউক কিছু জাদু করেছে এবং টাক = টোকা দিয়েছে। একটি ভাষায় যেখানে true = falseবৈধ বক্তব্য আছে, আমি নিশ্চিত যে আপনি এটি করতে পারেন এমন একটি উপায় রয়েছে (:
চেসোফনার্ড

1
@ আরগেল: কোন পদ্ধতিটি আরও দক্ষ তা নির্ধারণ করা আপনি কোন ধরণের ক্রিয়াকলাপ, ম্যাট্রিক্সের আকার ইত্যাদি প্রয়োগ করতে চেয়েছিলেন তার উপর নির্ভর করবে সংক্ষেপে, এটি সম্ভবত সমস্যা-নির্ভর। আসলে, কখনও কখনও লুপের জন্য একটি ভাল পুরানো দ্রুততম পছন্দ হতে পারে।
জিনোভাইস

2
@ অদলবদল, আমি একটি সম্পাদনা প্রস্তাব sum(M, 1)। প্রাথমিকভাবে মনে করা sumযেতে পারে স্বেচ্ছাচারিত আকারের ম্যাট্রিক্সের জন্য এভাবে ব্যবহার করা যেতে পারে এবং ম্যাট্রিক্স একদিন হলে স্টাম্পড হয়ে যায় 1-by-n
স্টিভি গ্রিফিন

24

আপনি আরও অস্পষ্ট মতলব ফাংশন বিএসএক্সফুন চাইতে পারেন । মতলব ডকুমেন্টেশন থেকে, বিএসএক্সফুন "ফাংশন হ্যান্ডেল মজাদার দ্বারা নির্দিষ্ট করা এলিমি বাই-এলিমেন্ট বাইনারি অপারেশন প্রয়োগ করে অ্যারে এবং এ বিতে, সিঙ্গেলটন প্রসারণ সক্ষম করেছে।"

@ উপবৃত্তির উপরে উল্লিখিত হয়েছে যে যোগফল এবং অন্যান্য মৌলিক ফাংশনগুলি ইতিমধ্যে প্রথম অ-সিঙ্গলটন মাত্রায় (যেমন, সারিগুলি একাধিক সারি থাকলে, কলামগুলিতে কেবল একটি সারি রয়েছে, বা নিম্ন মাত্রার সমস্ত আকার == 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)

সুতরাং বিএসএক্সফুন আপনাকে কয়েকটি পদক্ষেপগুলি সংরক্ষণ করে (আপনার স্পষ্টভাবে এ এর ​​মাত্রাগুলি গণনা করার দরকার নেই)। তবে, আমার কিছু অনানুষ্ঠানিক পরীক্ষায় দেখা গেছে যে ফাংশনটি প্রয়োগ করতে হলে (উপরে আমার পাওয়ার ফাংশনটির মতো) সহজ হলে রিপ্যাট প্রায় দ্বিগুণ দ্রুত হয়। সুতরাং আপনি সরলতা বা গতি চান কিনা তা চয়ন করতে হবে।


21

এটি কতটা দক্ষ তা নিয়ে আমি মন্তব্য করতে পারি না, তবে এখানে একটি সমাধান রয়েছে:

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)

আরও সাধারণ জবাব এখানে দেওয়া হল ।
উইক

11

অ্যালেক্সের উত্তরে বিল্ডিং , এখানে আরও জেনেরিক ফাংশন রয়েছে:

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))'

6

পরিপূর্ণতা / আগ্রহের জন্য আমি যোগ করতে চাই যে মাতলাব একটি ফাংশন রয়েছে যা আপনাকে প্রতি উপাদানটির পরিবর্তে প্রতি সারি ডেটাতে কাজ করতে দেয়। একে rowfun( http://www.mathworks.se/help/matlab/ref/rowfun.html ) বলা হয় তবে কেবল "সমস্যা" হ'ল এটি টেবিলগুলিতে কাজ করে ( http://www.mathworks.se/help/ মতলব / ref & / table.html ) বদলে ম্যাট্রিক্স


4

এই প্রশ্নের উত্তরের ক্রমবর্ধমান প্রকৃতির সাথে যুক্ত করে, আর -2016 বি দিয়ে শুরু করে, ম্যাটল্যাব স্পষ্টতই সিঙ্গেলটন মাত্রা প্রসারিত করবে, bsxfunঅনেক ক্ষেত্রে প্রয়োজনীয়তা সরিয়ে ফেলবে ।

থেকে r2016b রিলিজ নোট :

অন্তর্ভুক্ত সম্প্রসারণ: দৈর্ঘ্য 1 এর মাত্রার স্বয়ংক্রিয়ভাবে বিস্তৃতকরণের সাথে অ্যারেগুলিতে উপাদান-ভিত্তিক ক্রিয়াকলাপ এবং কার্যগুলি প্রয়োগ করুন

অন্তর্নিহিত সম্প্রসারণ স্কেলার প্রসারণের একটি সাধারণীকরণ। স্কেলার সম্প্রসারণের সাথে, স্কেলার উপাদান-ভিত্তিক ক্রিয়াকলাপগুলির সুবিধার্থে অন্য অ্যারে হিসাবে একই আকারে প্রসারিত হয়। অন্তর্নিহিত প্রসারণের সাথে, এখানে তালিকাভুক্ত উপাদান-ভিত্তিক অপারেটর এবং ফাংশনগুলি সুস্পষ্টভাবে তাদের ইনপুটগুলি একই আকার হিসাবে প্রসারিত করতে পারে, যতক্ষণ না অ্যারেগুলির সাথে সামঞ্জস্যপূর্ণ আকার থাকে। দুটি অ্যারে সুসংগত মাপযুক্ত থাকে যদি প্রতিটি মাত্রার জন্য, ইনপুটগুলির ডাইমেনশন আকারগুলি হয় একই হয় বা তার মধ্যে একটি হয় ১. আরও তথ্যের জন্য বেসিক অপারেশন এবং অ্যারে বনাম ম্যাট্রিক্স অপারেশনগুলির জন্য সামঞ্জস্যপূর্ণ অ্যারে আকারগুলি দেখুন।

Element-wise arithmetic operators+, -, .*, .^, ./, .\

Relational operators<, <=, >, >=, ==, ~=

Logical operators&, |, xor

Bit-wise functionsbitand, bitor, bitxor

Elementary math functionsmax, min, mod, rem, hypot, atan2, atan2d

উদাহরণস্বরূপ, আপনি ম্যাট্রিক্স এতে প্রতিটি কলামের গড় গণনা করতে পারেন, এবং তারপরে প্রতিটি কলাম থেকে গড় মানগুলির ভেক্টরকে A - গড় (এ) দিয়ে বিয়োগ করতে পারেন।

পূর্বে, এই কার্যকারিতাটি বিএসএক্সফুন ফাংশনের মাধ্যমে উপলব্ধ ছিল। এখনই আপনি বিএসএক্সফুনের বেশিরভাগ ব্যবহারগুলি ফাংশন এবং অপারেটরগুলিকে সরাসরি কল সহ প্রতিস্থাপন করবেন যা অন্তর্নিহিত প্রসারণ সমর্থন করে। বিএসএক্সফুন ব্যবহারের তুলনায়, অন্তর্নিহিত সম্প্রসারণ দ্রুত গতি, আরও ভাল মেমরির ব্যবহার এবং কোডের উন্নত পাঠযোগ্যতা সরবরাহ করে।


2

উপরের উত্তরগুলির মধ্যে আমার পক্ষে "বাক্সের বাইরে" কাজ হয়নি, তবে অন্যান্য উত্তরের ধারণাগুলি অনুলিপি করে নিম্নলিখিত ফাংশনটি কার্যকর করেছে:

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

1

মতলবের সাম্প্রতিক সংস্করণগুলির সাথে, আপনি আপনার সুবিধার জন্য সারণী ডেটা কাঠামোটি ব্যবহার করতে পারেন। এমনকি একটি 'রোউফান' অপারেশন রয়েছে তবে আমি এটি করা সহজ করে দেখলাম:

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)')

1

গৃহীত উত্তরটি মনে হয় প্রথমে কোষে রূপান্তর করা হবে এবং তারপরে cellfunসমস্ত কক্ষকে পরিচালনা করতে ব্যবহার করা হবে। আমি নির্দিষ্ট অ্যাপ্লিকেশনটি জানি না, তবে সাধারণভাবে আমি bsxfunম্যাট্রিক্সের উপরে কাজ করতে আরও দক্ষ হবে বলে মনে করব । মূলত bsxfunদুটি অ্যারে জুড়ে একটি অপারেশন উপাদান দ্বারা উপাদান প্রয়োগ করে। সুতরাং আপনি যদি অ্যারে পেতে ভেক্টরের n x 1প্রতিটি আইটেম দ্বারা ভেক্টরের প্রতিটি আইটেমকে গুণতে চান, আপনি এটি ব্যবহার করতে পারেন:m x 1n 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 ডকুমেন্টেশনে অনেকগুলি অন্তর্নির্মিত ফাংশনগুলির একটি তালিকা রয়েছে তবে মূলত আপনি যে কোনও ফাংশনকে দুটি অ্যারে (ভেক্টর বা ম্যাট্রিক্স) আর্গুমেন্ট হিসাবে গ্রহণ করে এবং এটি কাজ করতে পারেন তার নাম রাখতে পারেন।


-1

কীভাবে একটি ম্যাট্রিক্সের সারি অঙ্কগুলি গণনা করতে হবে তা সন্ধান করার সময় এই প্রশ্ন / উত্তরকে স্তম্ভিত করে।

আমি কেবল এটি যুক্ত করতে চাই যে মতলবের এসইউএম ফাংশনটিতে একটি নির্দিষ্ট মাত্রার জন্য যোগফলের পক্ষে সমর্থন রয়েছে, অর্থাত্ দুটি মাত্রা সহ একটি স্ট্যান্ডার্ড ম্যাট্রিক্স।

সুতরাং কলামের অঙ্কগুলি গণনা করতে হবে:

colsum = sum(M) % or sum(M, 1)

এবং সারির অঙ্কের জন্য, সহজভাবে করুন

rowsum = sum(M, 2)

আমার বাজি হ'ল এটি লুপের জন্য প্রোগ্রামিং এবং কোষে রূপান্তরকরণ উভয়ের চেয়ে দ্রুত is

এই সবগুলি SUM এর জন্য ম্যাটল্যাব সহায়তাতে পাওয়া যাবে।


7
একটি নির্দিষ্ট মাত্রা বরাবর এসইউএম প্রয়োগ করার দক্ষতা এই প্রশ্নের মূল উত্তরের প্রথম বাক্যে উল্লেখ করা হয়েছিল। এরপরে উত্তরটি কেসটিকে সম্বোধন করতে গিয়েছিল যখন একটি মাত্রা বাছাই করার ক্ষমতা ইতিমধ্যে ফাংশনে অন্তর্নির্মিত হয়নি। আপনি ঠিক বলেছেন, যদিও অন্তর্নির্মিত মাত্রা-নির্বাচন বিকল্পগুলি ব্যবহার করা - যখন সেগুলি উপলভ্য থাকে - লুপ বা কোষে রূপান্তরিত করার জন্য প্রায় সর্বদা দ্রুত faster
সিজেএইচ

সত্য যে, তবে, উপরের উত্তরটি আমাকে মাতলাব ডকুমেন্টেশনে ফিরে পাঠিয়েছে, যেহেতু আমার এ সমস্ত অভিনবত্বের প্রয়োজন ছিল না, তাই আমি সন্ধান করতে থেকে সরল সমাধানের প্রয়োজনে অন্যকে ভাগ করে বাঁচাতে চেয়েছিলাম।
আজ

-2

আপনি যদি আপনার সারিগুলির দৈর্ঘ্য জানেন তবে আপনি এই জাতীয় কিছু তৈরি করতে পারেন:

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) )

2
যে কেউ এই উত্তরটি দেখেন তাদের পক্ষে: এটি করার উপায় এটি নয়! এটি ম্যাটল্যাবে কিছু করার উপায় নয়!
স্টিভি গ্রিফিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.