2012-06-02 1 views
0

Я написал этот код:Запишите цикл for/while с «if/else» более элегантным способом?

A является nXm матрица

[nA, mA] = size(A); 

currentVector(nA,mA) = 0; 
for i = 1: nA 
    for j = 1 : mA 
     if A (i,j) ~= 0 
      currentVector(i,j) = ceil(log10(abs(A(i,j)))); 
     else 
      currentVector(i,j) = 0; 
     end 
    end 
end 

Как я могу написать код выше в более «MatLab» способом?

Есть ли ярлыки для if/else и для циклов? например, в C:

int a = 0; 
int b = 10; 
a = b > 100 ? b : a; 

тех if/else условиях продолжает напоминать мне о C и Java.

Благодаря

ответ

5
%# initialize a matrix of zeros of same size as A 
currentVector = zeros(size(A)); 

%# find linear-indices of elements where A is non-zero 
idx = (A ~= 0); 

%# fill output matrix at those locations with the corresponding elements from A 
%# (we apply a formula "ceil(log10(abs(.)))" to those elements then store them) 
currentVector(idx) = ceil(log10(abs(A(idx)))); 
+0

Лучшее решение, но я думаю, вы должны указать какое-то объяснение. ;-) – kay

+2

@kay: сделано. Не стесняйтесь добавлять ссылки на соответствующие разделы в документации MATLAB (я уверен, что есть много обсуждений написания векторизованного кода и выполнения индексации матрицы) – Amro

+0

@Amro: Удивительно, я буду использовать это с этого момента. Благодаря! – ron

1
currentVector = ceil(log10(abs(A))); 
currentVector(A == 0) = 0; 

Примечание: в Matlab это абсолютно легально применять журнал о нулях - результат: -inf.

 Смежные вопросы

  • Нет связанных вопросов^_^