2014-12-14 2 views
1

Почему я не могу получить те же результаты от 1-го и 2-го кодирования? Где моя ошибка? Я переделал первый блок кода, показанный во втором блоке ниже. Но я не могу найти, где ошибка:Ошибка при программировании Matlab - изменение результатов из аналогичных блоков кода

1)

V = [5,17,-3,8,0,-7,12,15,20,-6,6,4,-7,16]; 

a=length(V); 

for k=1:a 

    if V(k)>0 && (rem(V(k),3)==0 || rem(V(k),5)==0) 

     V(k)=2*V(k); 

     elseif -5 < V(k) < 0 

      V(k)=V(k)^3; 

    end 

    end   

2)

V = [5,17,-3,8,0,-7,12,15,20,-6,6,4,-7,16]; 

a=length(V); 

for k=1:a 

    b=V(k); 

    if b>0 &&(rem(b,3)==0 || rem(b,5))==0 

     b=2*b; 

     elseif -5 < b < 0 

      b=b^3; 

    end 

    end  
+3

b не является указателем на V (k), поэтому, когда вы делаете b = 2 * b, он не изменяет оригинал V (k) –

ответ

3

Есть 2 ошибки в коде:

  1. Синтаксические: Вы разместили ==0 вне круглой скобки, когда checki ng if состояние. то есть (rem(b,3)==0 || rem(b,5)) ==0 не совпадает с (rem(b,3)==0 || rem(b,5)==0) в первой части кода.

    1. В последнем случае, вы проверяете, если б кратно 3 или кратно 5, который, я считаю, что вы хотите?

    2. Однако в первом случае, вы проверяете, если б кратно 5 и не кратна 3.

  2. Логическое: Вы полагаете, что оператор присваивания b=V(k) передает ссылку на элемент kth-index в векторе V до b, однако Matlab только pass-by-value. Поэтому, как только вы передали значение V(k) в b, любые изменения, внесенные в b, не повлияют на V(k), потому что b НЕ указывает на V(k). Таким образом, в конце цикла b будет содержать только последний элемент V, то есть V(length(V)), измененный в соответствии с пунктом if-elseif.

Вы можете обратиться к Working with Pointers раздел на сайте Mathworks, чтобы узнать больше о том, как работать с указателями, если это действительно то, что вы хотите.

+1

Aw. Большое спасибо, я понял это сейчас. Я очень ценю вашу помощь –

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