romanbird
romanbird

Reputation: 178

bsxfun() Invalid output dimensions

I have a function that takes upto seven arguments and returns a row vector. The first three arguments are vectors (column, column, row) and the remaining four are optional scalars.

I want to use bsxfun() to apply the function to a vector of its last argument. Below is my attempt to do that.

o = @(m,pulse,N0,samples_per_pulse,sample_select,filter,channel_cutoff) ELE452Functions.EvaluateBER(m,pulse,N0,samples_per_pulse,sample_select,filter,channel_cutoff);
oo = @(m,pulse,N0,samples_per_pulse,sample_select,filter,channel_cutoff) bsxfun(@(N0,channel_cutoff) o(m,pulse,N0,samples_per_pulse,sample_select,filter,channel_cutoff), N0' , channel_cutoff);

when I try to call the function with a vector, oo(m,pulse,N0,1,1,1,[0.5 0.2]); for example, I get this error:

Error using bsxfun
Invalid output dimensions.

I am not experienced in using bsxfun and I tried to follow the documentation.

Update:

May be this is a clearer way to ask my question: I want to use bsxfun to rewrite (improve) the code below with out a loop.

for i=1:length(channel_normalized_cuttoffs)
    BER_LPchannel(i,:) = ELE452Functions.EvaluateBER(m,pulse,N0,1,1,1,channel_normalized_cuttoffs(i));
end

Upvotes: 0

Views: 554

Answers (1)

knedlsepp
knedlsepp

Reputation: 6084

The idea behind bsxfun is to evaluate a certain function for all possible combinations of two elements (b in bsxfun stands for binary), each coming from one of the arrays. (NB: This is valid if you use it with a row and a column vector. But bsxfun can also do more.)

What you want to achieve is simply: For all entries of a single array, evaluate a function. So bsxfun is just not the correct choice here.

You could use arrayfun instead, but this still may not perform a lot better than your original for loop, as it looks like the Matlab JIT Compiler would be able to optimize most of it, considering it's simplicity.

As I don't have the code of your function, I'm not able to test it, but your solution might look a lot like this:

evalBER = @(CNcutoffi) ELE452Functions.EvaluateBER(m,pulse,N0,1,1,1,CNcutoffi);
BER_LPchannel = arrayfun(evalBER, channel_normalized_cuttoffs, 'UniformOutput', false)

Upvotes: 1

Related Questions