WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Wert in Array einfügen

 

tim91

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2014, 13:42     Titel: Wert in Array einfügen
  Antworten mit Zitat      
Hallo zusammen,
ich würde gerne in einen Vektor an eine beliebgen n-te Stelle einen Wert einfügen.
Mit welchem Befehl schaffe ich das?
Vielen Dank.


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 20.10.2014, 14:31     Titel:
  Antworten mit Zitat      
Hallo,

vielleicht soetwas:
Code:
x = 1:5;
n = 3; %n-te stelle
w = 17; % einzufügender Wert
x = [x(1:n-1), w, x(n:end)]; % [1, 2, 17, 3, 4, 5]

Damit fügst du an der n-ten Stelle (3) den Wert w (17) ein.

Falls das nicht das gewünschte ist, bitte noch mal detaillierter nachfragen. Am besten mit Beispiel.

Viele Grüße,
Nras-
Private Nachricht senden Benutzer-Profile anzeigen
 
tim912

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2014, 14:54     Titel: Spalte einfügen
  Antworten mit Zitat      
Vielen Dank super,
wie funktioniert es wenn ich eine ganze spalte an n-ter stelle einfügen möchte?
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 20.10.2014, 15:27     Titel:
  Antworten mit Zitat      
Hallo,

das geht durch Angabe der Zeilenauswahl mit dem Doppelpunkt für alle Zeilen. Zusätzlich müssen natürlich die Dimensionen stimmen
Code:
x = reshape(1:30, 5, 6); % 5x6 Matrix
n = 3; %n-te stelle
w = ones(5,1)*17; % einzufügende Spalte
x = [x(:,1:n-1), w, x(:,n:end)]; % 5x7 Matrix

In Worten: Nimm von x alle Zeilen der ersten n-1 Spalten, setze dann die neue Spalte w dran und dann nimm alle Zeilen der Spalten von n bis zum Ende und hänge sie dran.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
tim91

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2014, 15:41     Titel: Genau danke!
  Antworten mit Zitat      
Perfekt,
ein Platz in der Danksagung meiner Bachelorarbeit ist dir sicher...
;D
 
Pendler01
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 30.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2017, 20:46     Titel:
  Antworten mit Zitat      
Hallo zusammen,

auch wenn der Thread schon etwas älter ist, muss ich das Thema nochmal aufgreifen.

Ich habe einen Datensatz mit knapp 400 k Werten (:,1), aus welchem ich Werte entnehmen möchte, die größer oder kleiner einem vorgegebenen Wert sind.

Code:

Dataset = Dataset_Test;
Length = length(Dataset);
 
p_down = prctile(Dataset(1:Length-1,1),down);                                      
[row_down] = find(Dataset <= p_down);                   % Perzentile down Position
value_down = Dataset(Dataset <= p_down);                % Perzentile down Wert

p_up= prctile(Dataset(1:Length-1,1),up);
[row_up] = find(Dataset >= p_up);                       % Perzentile down Position
value_up = Dataset(Dataset >= p_up);                     % Perzentile down Wert
 


Soweit so gut. Nach der Bearbeitung des verbleibenden Datensatzes möchte ich diese Werte (value_down / value_up) an ihrer ehemaligen Position im Datensatz wieder im integrieren. Hierfür habe ich oben genannten Code genommen.

Code:

%% Einpflegung der Perzentile
 yfit_input =yfit;

%yfit_input = zeros(length(yfit):length(yfit)*3);

for i = 1:length(row_up)
    n = row_up(i,1); %n-te stelle
    w = value_up(i,1); % einzufügender Wert
    yfit_input = [yfit_input(1:n-1), w, yfit_input(n:end)];
 


Grundsätzlich enstehen dabei mit dem Beispieldatensatz folgende Probleme:

1. Bei der Einpflegung von zeros zur Vermeidung von Indexüberschreitungen im bearbeiteten Datensatz yfit (siehe dritte Codezeile) überschreite ich die maximale Größe von Spalten in Matlab, ergo muss ich auf Zeilen wechselen. Hier erhalte ich den Fehler:
Code:

Dimensions of matrices being concatenated are not consistent.
 


2. Daten die am Ende des Datensatzes wieder eingefügt werden (also dessen gespeicherte Position größer ist,als der Vektor yfit_input), überschreiten logischerweise den Index.

Anbei mal die beiden Testdatensätze.

3. Und noch eine kurze Logikfrage, theoretisch müsste ich doch die Werte ihrer Positionierung nach aufsteigend auch wieder einpflegen, weil ich sonst die Positionierung im gesamten Datensatz verändere. Kurz wenn ich erst alle value_up einfüge, dann sind die Ursprungspositionen durch nicht mehr gegeben. Gibt es einen einfachen Weg das zu umgehen?

Code:

[row_index] = find(Dataset <= p_down & Dataset >= p_up);                   % Perzentile down Position
value_updown = Dataset(Dataset <= p_down & Dataset >= p_up);
 

So erhalte ich ja logische Werte.

Danke für jede Hilfe.
Julian

Testdaten.mat
 Beschreibung:
Datensatze

Download
 Dateiname:  Testdaten.mat
 Dateigröße:  431.28 KB
 Heruntergeladen:  289 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 26.10.2017, 12:46     Titel:
  Antworten mit Zitat      
Hallo

zu 1) Du benutzt einfach die Funktion zeros falsch. Wozu verwendest du hier den Doppelpunkt? so wird eine Matrix der Dimension n*n1*n2....n(m-1)*n(m) erzeugt, was mit Sicherheit irgendwann die Speichergrenzen sprengt.
Aber keine Ahnung was du hier genau zu erreichen versuchst. Wolltest du eine Matrix der Dimension n*m erzeugen, wo n = length(yfit) und m = n*3
Dann wäre es so richtig:
Code:

yfit_input = zeros(length(yfit), length(yfit)*3);
 


zu den Fehlermeldung selbst, da versuchst du Spaltenvektor mit Zeilenvektor zu verbinden, das läuft halt schief

zu 2) Wenn du Indizien aus Dataset auf yfitinput verwenden möchtest, dann müssen diese Matrizen/Vektoren gleich groß sein. Das musst du aber schon davor sicherstellen, sonst kannst du die Werte an die ehemalige Position nicht integrieren, wenn deine Dimensionen nicht stimmen.

Da ich nicht weiß was yfit ist und wie diese Variable erzeugt wird, kann man an der Stelle schwer, einen richtigen Tipp geben.

zu 3) Den Code von oben ist nicht für dein Problem geeignet.
Oben wird die Matrix/Vektor um Werte erweitert also vergrößert. Oder nicht vorhandener Vektor/nicht vorhandene Matrix aus Werten zusammengesetzt.
Bei dir bewirkt es aber, dass der Vektor stets erweitert wird.
Bei jedem Erweitern , verändern sich die Dimensionen, was zu verschieben der Positionen führt.
Du möchtest aber doch die Postionen beibehalten, dazu hast du bereits Indizien
z.B du möchtest die gefundenen Werte in anderen Vektor kopieren, dann mach doch so:
Code:

NewDataset = zeros(size(Dataset))
[row_index] = find(Dataset <= p_down | Dataset >= p_up);        
value_updown = Dataset(Dataset <= p_down | Dataset >= p_up);
% kopieren
NewDataset(row_index) = value_updown
 


noch kompakter:

Code:

NewDataset    = zeros(size(Dataset))
[row_index]    = Dataset <= p_down | Dataset >= p_up;        
value_updown = Dataset(row_index);
% kopieren
NewDataset(row_index) = value_updown
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.