Вопрос по matlab, conditional-operator, if-statement – Один вкладыш для если затем [дубликата]

1

На этот вопрос уже есть ответ здесь:

троичный оператор в Matlab 7 ответов

Для этого есть MATLAB?

if a > b
    foo = 'r';
else
    foo = 'g';
end
@SibbsGambling, но любой (то есть вы) может редактировать дубликат заголовка. На самом деле я сделаю это сейчас. Dan
@jkalden Я думаю, что SO, безусловно, должен пересмотреть свою «политику двуличия». Связанный вопрос имеет название нулевой информации. Никто не нажмет на этот вопрос. Здесь не тот случай. Sibbs Gambling
Это о содержании или заголовках? Я нашел это с поиском менее минуты. Хотя я довольно новичок в SO, мне часто говорили, что вам следует поискать, прежде чем задавать вопрос. Вы можете изменить заголовок другого вопроса, чтобы улучшить его ... jkalden

Ваш Ответ

3   ответа
5

ертируйте свою логику в (векторную) математику:

foo = 1 + (a <= b)

Редактировать:

В более общем случае присваивания 'r' или 'g' вы можете использовать:

col = {'r', 'g'};
foo = col(1 + (a > b));

Так, например, с логическим значением isGreen вы можете сделать:

foo = col(1 + isGreen);

Это также может быть логическая функция возврата

foo = col(1 + isGreen(a))
@SibbsGambling - редактируется после обновления вашего вопроса. Ofri Raviv
Извините за ввод в заблуждение, но я имел в виду более широкий случай (см. Обновленный вопрос). Sibbs Gambling
@ Дан, я не согласен по поводу читабельности. Просто дайте (a> b) какое-то значимое имя (что, очевидно, я не могу, потому что это вопрос без контекста), и присвойте его в отдельной строке, тогда col (1 + isGreen), например, очень ясно, потому что Бит "1 + ..." - это просто преобразование логической логики на основе 0 в индексы matlab на основе 1, что очевидно и знакомо любому, кто работает в matlab. Ofri Raviv
лучший ответ, очень общий - однако я бы начал сомневаться в читаемости кода. Вероятно, имеет больше смысла придерживатьсяif заявления в этом случае, чтобы будущие кодеры (включая вас) не должны были расшифровывать происходящее. Dan
8

но если ваше утверждение действительно простое, вы можете написать его в одну строку.

Я имел обыкновение иметь однострочные операторы if в моем старом проекте:

if (k < 1); k = 1; end;

В вашем случае это будет выглядеть примерно так:

if a > b; foo = 'r'; else; foo = 'g'; end;

или, если вам не нравятся точки с запятой

if a > b, foo = 'r'; else, foo = 'g'; end

Впрочем, не так красиво, как вы могли ожидать.

Конечно, для вашего первого примера вы могли бы сделатьk = max(1, k); Edric
8

как тернарный оператор в стиле C, но вы можете воспользоваться тем, что в этой ситуации matlab автоматически преобразует логические значения в двойные. Таким образом, вы можете просто умножить желаемый результат на true (r в этом случае) по вашему состоянию (a > b), и добавьте это к продукту желаемого результата для ложного (т.е.g) сне вашего состояния:

foo = (a > b)*c + (~(a > b))*d

так что если мы позволимc = 'r' а такжеd = 'g' тогда все, что нам нужно сделать, это броситьfoo вернуться кchar в конце:

char(foo)

или же

char((a > b)*'r' + ~(a > b)*'g')

Обратите внимание, что это будет работать только еслиc а такжеd имеют одинаковые размеры (из-за+) ...

@SibbsGambling Я все еще думаю, что вы должны поставить под сомнение удобочитаемость этого подхода и подумать о том, чтобы придерживатьсяif подход... Dan
Извините за ввод в заблуждение, но я имел в виду более широкий случай (см. Обновленный вопрос). Sibbs Gambling
@SibbsGambling, это все равно должно работать в более широком случае - вам, возможно, просто придется немного кастовать Dan

Похожие вопросы