як абнавіць зменную ў MATLAB?

ці ёсць спосаб, каб абнавіць значэнне зменнай, якая залежыць ад іншай зменнай?

Паглядзіце на гэтым простым прыкладзе:

<�Моцны> CODE:

variable1 = 1;

variable2 = 2 * variable1

variable1 = 3;

variable2

<�Моцны> ВЫСНОВА:

variable2 =

     2


variable2 =

     2

Я хацеў бы, каб пасля змены значэння variable1, variable2 б змяніць без неабходнасці перагляду яго, як гэта:

<�Моцны> CODE:

variable1 = 1;

variable2 = 2 * variable1

variable1 = 3;

variable2 = 2 * variable1

<�Моцны> ВЫСНОВА:

variable2 =

     2

variable2 =

     6
2
Гэта проста не так, як зменныя працуюць у MATLAB або любой іншай мове па гэтым пытанні. У некаторых мовах падтрымліваюць вылічаныя ўласцівасць, якія робяць тое, што вы просіце, але я не ведаю, калі гэта мае месца для MATLAB.
дададзена аўтар Klaus Byskov Pedersen, крыніца
Як бы паказальнікі выправіць гэта? Яны карысныя для дакладнасці накладання адной зменнай у іншую, але не перевычисления змесціва зменнай у залежнасці ад чужога значэння.
дададзена аўтар Andrew Janke, крыніца
Найлепшым варыянтам было б выкарыстоўваць паказальнікі, якія, на жаль, Matlab не падтрымлівае.
дададзена аўтар David K, крыніца

6 адказы

Наколькі я ведаю, гэта не можа быць зроблена аўтаматычна ў MATLAB.

Я хацеў бы стварыць скрыпт, які робіць усё абнаўлення, і называць яго кожны раз, калі variable1 змяняецца.

variable1 = 1;
update_vars

Гэта самы лепшы спосаб, якім я магу думаць. Гэта лёгка пісаць і лёгка чытаць.

1
дададзена

Як ужо згадвалася (менш канкрэтна) у адным з каментароў, такога роду паводзіны магчыма шляхам стварэння класа з залежнымі ўласцівасцямі, якія вылічаюцца "на ляту". прыклад:

classdef ReplaceWithAMeaningfulName < handle
    properties (Dependent)
        data % The property that holds the instance's main value
    end

    properties (Dependent, SetAccess = private) % Only get-access, please
        someCalculatedValue % Something calculated
    end

    properties (Access = private)
        m_data % The private storage for data property
    end

    methods
        function self = ReplaceWithAMeaningfulName(data)
            % Constructor
            if nargin > 0
                self.data = data;
            end
        end

        % Property accessors for data property
        function set.data(self, value)
            assert(isnumeric(value), [mfilename ':InvalidValue'], ...
                'Value for property ''data'' must be numeric.');
            self.m_data = value;
        end

        function value = get.data(self)
            value = self.m_data;
        end

        % Property accessor for your calculated value
        function value = get.someCalculatedValue(self)
            value = self.data * 2;
        end
    end
end

Зараз, вы можаце выкарыстоўваць яго наступным чынам

>> x = ReplaceWithAMeaningfulName(123);
>> x.someCalculatedValue

ans =

   246

>> x.data = 500;
>> x.someCalculatedValue

ans =

        1000
1
дададзена

Калі вы сапраўды хочаце, што вы не павінны, вы маглі б зрабіць Variable2 і г.д. ў функцыі і выкарыстоўваць Evalin , каб атрымаць бягучае значэнне variable1 </код >:

variable2 = @() 2 * evalin('caller', 'variable1')
variable1 = 1;
variable2() % output: 2
variable1 = 15;
variable2() % output: 30

Гэта даволі непрыгожа рашэнне, і я б не выкарыстоўваць яго сам. Калі ваш код у функцыі ёсць трохі лепшае рашэнне (у тым сэнсе, што ён не выкарыстоўвае Eval):

function [ ... ] = myFun( ... )
variable1 = 1;
variable2() % output: 2
variable1 = 15;
variable2() % output: 30
    function v2 = variable2; v2 = 2 * variable1; end
end

Тым не менш, я б асабіста выкарыстоўваць нешта падобнае на Роберта P, update_vars сцэнара. Зноў жа, калі вы знаходзіцеся ў функцыі вы можаце выкарыстоўваць той факт, што

1
дададзена

Вы можаце выкарыстоўваць функцыю Eval:

variable2 = eval('2*eval(''variable1'')')
0
дададзена
Неа - гэта толькі атрымлівае адзнаку адзін раз, калі variable2 прызначаецца; ён будзе мець сапраўды такое ж паводзіны, як Variable2 = 2 * Variable1 .
дададзена аўтар Andrew Janke, крыніца

Вы можаце атрымаць вельмі блізка, змяніўшы Variable2 ад звычайнай зменнай укладзенай функцыі. У Matlab, зменныя і выклікі функцый маюць аднолькавы сінтаксіс (варыянт «котловой прынцып доступу»), так што вы можаце зрабіць прамую замену. Гэта працуе ў вашым выпадку, так як укладзеная функцыя ў Matlab з'яўляецца «замыканне», у тым, што ён мае доступ да жывога, абноўленыя значэнні ўсіх зменных у агароджвае працоўнай вобласці.

Гэта працуе толькі ўнутры функцыі, а не сцэнар або ў камандным радку.

function foo

v1 = 1;

% Define v2 in terms of the "live" v1 value
function v2_val = v2()
v2_val = 2 * v1;
end

v2  % evaluates to 1
v1 = 3;
v2  % evaluates to 6

end
0
дададзена

Чаму вы не хочаце выкарыстоўваць функцыю?

function [Out1, Out2] =  setVariables(Arg1);
   Out1 = Arg1;
   Out2 = 2*Arg1;
end


[Variable1, Variable2] = setVariables(2)

або выкарыстоўваць Сімс (вядома, гэта можа быць зроблена з дапамогай функцыі таксама)

syms Variable2(d);
Variable2(d) = 2*d;

Variable2(Variable1)
0
дададзена