Добавить элемент в начало вектора, не зная, является ли он вектором строки или столбца? - PullRequest
3 голосов
/ 14 апреля 2020

Если я добавлю newvlaue к вектору x строки, это будет

x = [newvlue, x] % use of ,

, но если к вектору x столбца, это будет

x = [newvlue; x] % use of ;

, поэтому я Я должен знать заранее, если это вектор строки или столбца, чтобы выполнить эту вставку спереди. Но я не всегда знаю, как х предназначен для ввода пользователя. Поэтому каждый раз, когда мне нужно выполнить эту проверку вектора строки или вектора столбца заранее. Однако, допустим, я не хочу заботиться о том, является ли это вектором строки или столбца, мне просто нужно добавить один элемент в начале массива. Есть ли какой-нибудь элегантный способ написания кода?

Ответы [ 5 ]

6 голосов
/ 14 апреля 2020

Вам нужно будет проверить размер входа:

x = [1, 2, 3]
% or
x = [1; 2; 3]
new = 0;

% flexible concatenation
y = cat(~(size(x,1) > 1) + 1, new ,x)

Пояснение

d = size(x,1) > 1   % check if column (=1) or row vector (>1)
z = ~(d) + 1        % results in either 1 or 2 for column or row vector
                    % as input for cat
y = cat(z, new ,x)  % concatenate in correct dimension

или с помощью isrow, как предложено в ответ ThomasIsCoding , но я думаю, что это почти то же самое:

z = isrow(x) + 1;

В любом случае вы должны использовать isvector чтобы проверить, является ли входной сигнал вектором, а не матрицей. Но на самом деле я бы порекомендовал преобразовать любой вектор ввода, строки или столбца в вектор-столбец с помощью

x = x(:)

, чтобы учесть кодирование внутри вашей основной функции.

2 голосов
/ 14 апреля 2020

Как сказал @ rahnema1 , просто добавьте новое значение в конец:

x = flip(x); 
x(end+1) = newvalue; 
x = flip(x);
2 голосов
/ 14 апреля 2020

Мне нравятся однострочные, попробуйте этот

a(1:end+1)=[100;a(:)]

работает как для матриц строк, так и для столбцов.

1 голос
/ 14 апреля 2020

Вы можете использовать индексирование, чтобы сместить все элементы на 1, а затем вставить новый элемент в начале.

x(2:end+1)=x;
x(1)=7;
1 голос
/ 14 апреля 2020

Может быть, вы можете определить свою пользовательскую функцию, как показано ниже

function y = addhead(x,val)
  if isrow(x)
    y = horzcat(val,x);
  else
    y = vertcat(val,x);
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...