Berechne Basen des Kerns und des Bildes der Matrix A. Verständnisproblem Musterlösung
Aufgabe:

Berechne Basen von Ker A und Im A für A =



| 1 | 0 | 1 | -1 |
| -1 | 1 | 2 | 1 |
| 0 | 2 | 7 | -1 |


  
Problem/Ansatz:

Um den Kern zu berechne, berechne ich Ax=0, weil der Kern ja alles auf die Null abbildet.

Also bringe ich meine Matrix A auf Zeilenstufenform mit dem Gaußalgorithmus und erhalte



| 1 | 0 | 1 | -1 |
| 0 | 1 | 3 | 0 |
| 0 | 2 | 6 | 0 |

Damit folgt:

x4 = x4, x2 = -3x3, x1 = x3-x4

Damit würde ich dann weiter rechnen.


  


In der Musterlösung wird allerdings anders vorgegangen.

Die Matrix wird dort auch wie oben auf die Zeilenstufenform gebracht.

Dann steht in der Lösung:


> „Hinzufügen von Zeilen mit -1 auf der Diagonalen liefert eine Basis B des Kerns in den Spalten 3 und 4, die ursprünglichen Vektoren in den Spalten 1 und 2 sind eine Basis C des Bildes.“

Also ist die geänderte Matrix:



| 1 | 0 | 1 | -1 |
| 0 | 1 | 3 | 0 |
| 0 | 0 | -1 | 0 |
| 0 | 0 | 0 | -1 |


  


C = Im A = ((1 (-1) 1)T, (0 1 2)T) und B = Ker A = ((1 3 (-1) 0)T, ((-1) 0 0 (-1)T)


  


Leider verstehe ich überhaupt nicht warum das so ist.

Warum entspricht eine Basis des Bildes von A den ersten beiden Spalten der Matrix A in Zeilenstufenform?

Bzw. was genau ist das Bild einer Matrix, ich habe ja keine Funktion gegeben?

Warum muss ich für die Basis des Kerns die Zeile mit -1 auf der Diagonalen hinzufügen und warum ist die 3. und 4. Spalte der so entstandenen Matrix dann eine Basis des Kerns ?


  


Vielen Dank schon mal im Voraus :)
Warum muss ich für die Basis des Kerns die Zeile mit -1 auf der Diagonalen hinzufügen und warum ist die 3. und 4. Spalte der so entstandenen Matrix dann eine Basis des Kerns ?
  


Der zweite Teil deiner Frage ist einfacher:

Du hattest doch x4 = x4, x2 = -3x3, x1 = x3-x4  bzw. ohne die 3.Zeile,

die ja auch eine 0-Zeile wird x2 = -3x3, x1 = x4-x3 (Da hattest du falsche Vorzeichen.)

und kannst also x4 und x3 frei wählen. Und die beiden Gleichungen

zeigen, dass alle Lösungen so aussehen:

( x4-x3 ; -3x3 ; x3 ; x4 )  = x3*(-1;-3;1;0) + x4(1; 0 ; 0 ; 1 )

oder wenn du als Faktor -x3 und -x4 nimmst

 = -x3*(1;3;-1;0) - x4(-1; 0 ; 0 ; -1 ) .
  


Und du siehst: Man kommt auf diese Basisvektoren, wenn man die

Matrix mit dem "-1-Trick" ergänzt.

Und da man nun weiß, dass der Kern die Dimension 2 hat

( 2 Basisvekt0ren) , weiß man aus dem Dimensionssatz:

dim(Bild) = Spaltenzahl von A  -  dim(Kern)

              =  4  - 2 = 2.

Alsi bilden je zwei lin. unabhängige Spalten von A

eine Basis des Kerns. Und weil die ersten beiden

Spalten von A ( vor der Umformung ) schon lin.

unabhängig sind, kann man diese nehmen.

War es vielleicht

C = Im A = ((1 (-1) 0)T, (0 1 2)T)
  


statt

C = Im A = ((1 (-1) 1)T, (0 1 2)T) ???
<p>sie sollten versuchen, schleifen generell zu vermeiden. sie sind normalerweise weniger effizient als satzbasierte lösungen und weniger lesbar.</p><p>das folgende sollte ziemlich effizient sein.</p><p>dies gilt umso mehr, wenn die spalten name und weight im index <code>include-</code> d sein könnten, um die schlüsselsuche zu vermeiden.</p><p>es kann den eindeutigen index in der reihenfolge <code>turn</code> scannen und die laufende summe der spalte <code>weight</code> berechnen. verwenden sie dann <code>lead</code> mit denselben ordnungskriterien, um die laufende summe zu ermitteln die nächste reihe wird sein.</p><p>sobald die erste zeile gefunden wird, in der diese 1000 überschreitet oder <code>null</code> ist (was anzeigt, dass keine nächste zeile vorhanden ist), kann der scan gestoppt werden.</p><pre><code>with t1 as (select *, sum(weight) over (order by turn rows unbounded preceding) as cume\_weight from [dbo].[line]), t2 as (select lead(cume\_weight) over (order by turn) as next\_cume\_weight, * from t1) select top 1 name from t2 where next\_cume\_weight &gt; 1000 or next\_cume\_weight is null order by turn </code></pre><h1>ausführungsplan</h1><p> <a href="https://i.stack.imgur.com/gb1mw.png">(<img src="https://i.stack.imgur.com/gb1mw.png" alt="enter image description here"></a> </p><p>in der praxis scheint es ein paar zeilen vor dem unbedingt erforderlichen zu lesen - es sieht so aus, als würde jedes fenster-spool/stream-aggregat-paar zwei zusätzliche zeilen lesen.</p><p>für die beispieldaten in der frage müssten im idealfall nur zwei zeilen aus dem index-scan gelesen werden, in wirklichkeit werden jedoch 6 zeilen gelesen. dies ist jedoch kein wesentliches effizienzproblem und verschlechtert sich nicht, wenn der tabelle weitere zeilen hinzugefügt werden (wie in) <a href="https://dbfiddle.uk/?rdbms=sqlserver\_2017&amp;fiddle=892e6bb7c1af912413b01d05e606a98a">diese demo</a> )</p><p>für diejenigen, die an dieser ausgabe interessiert sind, wird unten ein bild mit den von jedem operator ausgegebenen zeilen (wie durch das erweiterte ereignis <code>query\_trace\_column\_values</code> gezeigt) angezeigt. die zeilen werden in der reihenfolge <code>row\_id</code> ausgegeben (beginnend mit <code>47</code> für die erste zeile, die vom index-scan gelesen wurde und bei <code>113</code> für <code>top</code> endet)</p><p>klicken sie auf das bild unten, um es zu vergrößern, oder sehen sie alternativ <a href="https://imgur.com/a/c7npqqh">die animierte version, um den ablauf einfacher zu verfolgen</a> .</p><p>anhalten der animation an dem punkt, an dem das rechte stream-aggregat seine erste zeile ausgegeben hat (für gary - turn = 1). es scheint offensichtlich, dass es darauf gewartet hat, seine erste zeile mit einem anderen windowcount zu erhalten (für jo - turn = 2). und die fensterspule gibt die erste "jo" -zeile erst frei, wenn sie die nächste zeile mit einem anderen <code>turn</code> gelesen hat (für thomas - turn = 3)</p><p>die fensterspule und das stream-aggregat bewirken also, dass eine zusätzliche zeile gelesen wird, und es gibt vier davon im plan - daher 4 zusätzliche zeilen.</p><p> <a href="https://i.stack.imgur.com/cwllc.jpg">(<img src="https://i.stack.imgur.com/cwllc.jpg" alt="enter image description here"></a> </p><p>es folgt eine erläuterung der oben gezeigten spalten (basierend auf info <a href="https://www.microsoft.com/en-us/p/microsoft-sql-server-2012-high-performance-t-sql-using-window-functions/fgqpf3h0qlch">hier</a> )</p><ul> <li><strong> knotenname: index-scan, knoten-id: 15, spaltenname: id </strong> basistabellenspalte, die vom index abgedeckt wird</li> <li><strong> knotenname: index-scan, knoten-id: 15, spaltenname: drehen sie die basistabellenspalte </strong>, die vom index abgedeckt wird</li> <li><strong> nodename: clustered index seek, nodeid: 17, columnname: gewicht </strong> basistabellenspalte, die aus der suche abgerufen wurde</li> <li><strong> nodename: clustered index seek, nodeid: 17, columnname: name </strong> basistabellenspalte, die aus der suche abgerufen wurde</li> <li><strong> nodename: segment, nodeid: 13, columnname: segment1010 </strong> gibt 1 am anfang einer neuen gruppe zurück oder andernfalls null. da kein <code>partition by</code> in <code>sum</code> vorhanden ist, erhält nur die erste zeile 1</li> <li><strong> nodename: sequenzprojekt, nodeid: 12, columnname: rownumber1009 </strong> <code>row\_number()</code> innerhalb der durch das segment1010-flag angegebenen gruppe. da sich alle zeilen in derselben gruppe befinden, werden ganze zahlen von 1 bis 6 aufgestiegen. wird in fällen wie <code>rows between 5 preceding and 2 following</code> zum filtern von zeilen mit rechten rahmen verwendet. (oder wie für <code>lead</code> später)</li> <li><strong> nodename: segment, nodeid: 11, columnname: segment1011 </strong> gibt 1 am anfang einer neuen gruppe zurück oder andernfalls null. da kein <code>partition by</code> in <code>sum</code> vorhanden ist, erhält nur die erste zeile 1 (wie segment1010).</li> <li><strong> nodename: window spool, nodeid: 10, columnname: windowcount1012 </strong> attribut, das zeilen gruppiert, die zu einem fensterrahmen gehören. diese fensterspule verwendet den fall "fast track" für <code>unbounded preceding</code>. wo es zwei zeilen pro quellzeile ausgibt. eins mit den kumulativen werten und eins mit den detailwerten. obwohl es keinen sichtbaren unterschied in den durch <code>query\_trace\_column\_values</code> offenbarten zeilen gibt, gehe ich davon aus, dass kumulative spalten in der realität vorhanden sind.</li> <li><strong> nodename: stream aggregate, nodeid: 9, columnname: expr1004 </strong> <code>count(*)</code> gruppiert nach windowcount1012 gemäß plan, aber tatsächlich eine laufende anzahl</li> <li><strong> nodename: stream aggregate, nodeid: 9, columnname: expr1005 </strong> <code>sum(weight)</code> gruppiert nach windowcount1012 gemäß plan, aber tatsächlich die laufende gewichtssumme (dh <code>cume\_weight</code>)</li> <li><strong> nodename: segment, nodeid: 7, columnname: expr1002 </strong> <code>case when [expr1004]=(0) then null else [expr1005] end</code> - sehen sie nicht, wie <code>count(*)</code> kann sei 0, also läuft immer die summe (<code>cume\_weight</code>)</li> <li><strong> knotenname: segment, knoten-id: 7, spaltenname: segment1013 </strong> nein <code>partition by</code> in <code>lead</code>, sodass die erste zeile 1 erhält. alle verbleibenden werden null</li> <li><strong> nodename: sequenzprojekt, nodeid: 6, columnname: rownumber1006 </strong> <code>row\_number()</code> innerhalb der durch das segment1013-flag angegebenen gruppe. da sich alle zeilen in derselben gruppe befinden, sind dies ganze zahlen von 1 bis 4</li> <li><strong> nodename: segment, nodeid: 4, columnname: bottomrownumber1008 </strong> rownumber1006 + 1, da <code>lead</code> die nächste zeile erfordert</li> <li><strong> nodename: segment, nodeid: 4, columnname: toprownumber1007 </strong> rownumber1006 + 1, da <code>lead</code> die nächste zeile erfordert</li> <li><strong> knotenname: segment, knoten-id: 4, spaltenname: segment1014 </strong> nein <code>partition by</code> in <code>lead</code>, sodass die erste zeile 1 erhält. alle verbleibenden werden null</li> <li><strong> nodename: window spool, nodeid: 3, columnname: windowcount1015 </strong> attribut, das zeilen, die zu einem fensterrahmen gehören, unter verwendung der vorherigen zeilennummern gruppiert. der fensterrahmen für <code>lead</code> hat maximal 2 zeilen (die aktuelle und die nächste)</li> <li><strong> nodename: stream aggregate, nodeid: 2, columnname: expr1003 </strong> <code>last\_value([expr1002])</code> für <code>lead(cume\_weight)</code></li> </ul> Allgemein gilt im zwei- und dreidimensionalen Raum:


<a,b> = |a| * |b| * cos(φ), wobei <a,b> das Skalarprodukt ist, |.| die Länge der Vektoren bezeichnet und φ der Winkel zwischen a und b ist.


Algebraisch ist klar, dass hier 0 rauskommt, wenn φ=90° gilt, denn cos(90°)=0.


\_\_\_\_\_


Es gibt aber auch eine geometrische Erklärung:


Man kann laut der folgenden Zeichnung den Teil mit |b|*cos(φ) durch b\_a ersetzen, denn es gilt: cos(φ)= b\_a / |b|


 ![]()


Also folgt <a,b>=|a|*b\_a.


Wenn jetzt a senkrecht auf b steht, ist b\_a offenbar 0 und man hat <a,b>=|a|*0, oder <a,b>=0. Hallo Tekto,

ich habe Dir das für die Komponente \(m\_1\) mal gerechnet.

$$\begin{aligned} m\_1 &= (M \cdot r\_1) \frac{1}{|r\_1|} \\ &= \left( \begin{pmatrix}  3 \\ 2 \\ 2 \end{pmatrix}^T \cdot \begin{pmatrix}  -1 \\ 1 \\ 2 \end{pmatrix} \right) \frac{1}{\sqrt{(-1)^2 + 1^2 + 2^2}} \text{Nm} \\ &= (3\cdot (-1) + 2 \cdot 1 + 2 \cdot 2 ) \frac{1}{\sqrt{6}} \text{Nm}\\ &= \frac{3}{\sqrt{6}}\text{Nm} = \frac12 \sqrt{6}\, \text{Nm}\end{aligned}$$

Wenn Du noch die berechnete Komponente mit dem Einheitsvektor in der jeweiligen Richtung von \(r\_i\) multiplizierst, kommst Du zu dem Anteil des Moments in der jeweiligen Richtung. In Geoknecht3D sähe das so aus:

[![Untitled1.png](https://www.mathelounge.de/?qa=blob&qa_blobid=7877675525675045088)](https://www.matheretter.de/geoservant/de/?draw=gerade(0%7C0%7C0%20-1%7C1%7C2)%7B00F%7D+gerade(0%7C0%7C0%201%7C2%7C1)%7B0F0%7D+vektor(3%7C2%7C2)%7BC00%7D+punkt(-0.5%7C0.5%7C1%20%22M1%22)+punkt(1.5%7C3%7C1.5%20%22M2%22)+strecke(3%7C2%7C2%20-0.5%7C0.5%7C1)%7B666%7D+strecke(3%7C2%7C2%201.5%7C3%7C1.5)%7B666%7D)
  


(klick auf das Bild und rotiere die Szene mit der Maus)


> mm, cm - Ja wurde so angegeben. Aber kann man doch gegebengalls ignorieren oder ?

Bei der Berechnung der Komponenten des Moment - ja, weil hier durch den Betrag geteilt wird, dann hebt sich das auf. <h2>es kommt darauf an ™</h2><p>die fähigkeit, einen oder mehrere cursor zu umgehen, hängt davon ab, was in diesem cursor ausgeführt wird. ohne zu wissen, was darin vor sich geht, gibt es keine möglichkeit zu sagen. es kann sein, dass es keine problemumgehung gibt und sie eine zeilenweise verarbeitung durchführen müssen.</p><p>nachfolgend einige beispiele.</p><h2>funktioniert nicht in sets</h2><p>dieses beispiel ist das grundlegendste und ist einfach die tatsache, dass sie ihr gesamtes dataset oder teile ihres datasets auf einmal abfragen können, aber der cursor wurde erstellt und fragt die daten zeilenweise ab. übliche, durch die dies ersetzt werden kann, sind <code>join</code>, <code>cross apply</code>/<code>outer apply</code> und andere.</p><p><strong> betrachten sie den folgenden datensatz: </strong></p><pre><code>create table dbo.lotr(lotrid int, charactername varchar(255), val varchar(255)); create table dbo.lotrattributes(lotrattributeid int, lotrid int, attrval varchar(255)); insert into dbo.lotr(lotrid,charactername,val) values(1,'frodo','ring') ,(2,'gandalf','staff'); insert into dbo.lotrattributes(lotrid,lotrattributeid,attrval) values(1,1,'ringattribute1') ,(1,2,'ringattribute2') ,(1,3,'ringattribute3') ,(2,4,'staffattribute1') ,(2,5,'staffattribute2'); </code></pre><p>man könnte versuchen, jeden datensatz zu finden, und er stimmt separat überein, indem man die tabelle <code>lotr</code> durchläuft.</p><p><strong> cursor: </strong></p><pre><code>declare @lotrid int declare c cursor for select lotrid from dbo.lotr; open c fetch next from c into @lotrid; while @@fetch\_status = 0 begin select lotrattributeid from dbo.lotrattributes where lotrid = @lotrid; fetch next from c into @lotrid; end close c deallocate c </code></pre><p><strong> das ergebnis sind zwei ergebnismengen </strong></p><pre><code>lotrattributeid 1 2 3 lotrattributeid 4 5 </code></pre><p><strong> wenn dieses <code>inner join</code> verwendet wird, erhalten wir das gleiche ergebnis wie eine ergebnismenge. </strong></p><pre><code>select lotrattributeid from dbo.lotr l inner join dbo.lotrattributes la on l.lotrid = la.lotrid; lotrattributeid 1 2 3 4 5 </code></pre><hr><h2>string-manipulation</h2><p>häufig wird <code>for xml path('')</code> verwendet, um zeichenfolgenmanipulationen innerhalb von cursorn zu ersetzen.</p><p><strong> datensatz </strong></p><pre><code>create table dbo.lotr(lotrid int, charactername varchar(255), val varchar(255)); create table dbo.lotrattributes(lotrattributeid int, lotrid int, attrval varchar(255)); insert into dbo.lotr(lotrid,charactername,val) values(1,'frodo','ring'); insert into dbo.lotrattributes(lotrid,lotrattributeid,attrval) values(1,1,'ringattribute1') ,(1,2,'ringattribute2') ,(1,3,'ringattribute3'); </code></pre><p><strong> doppelcursor mit string-manipulation </strong></p><pre><code>declare @lotrid int, @charactername varchar(255), @val varchar(255) declare @lotrattributeid int, @attrval varchar(255) declare c cursor for select lotrid,charactername, val from dbo.lotr open c fetch next from c into @lotrid,@charactername,@val while @@fetch\_status = 0 begin set @charactername +='|'+ @val declare d cursor for select lotrattributeid, attrval from dbo.lotrattributes where lotrid = @lotrid open d fetch next from d into @lotrattributeid,@attrval while @@fetch\_status = 0 begin set @charactername +='['+@attrval+ '],' fetch next from d into @lotrattributeid,@attrval end close d deallocate d fetch next from c into @lotrid,@charactername,@val end close c deallocate c select left(@charactername,len(@charactername)-1); </code></pre><p><strong> ergebnis </strong></p><pre><code>(no column name) frodo|ring[ringattribute1],[ringattribute2],[ringattribute3], </code></pre><p><strong> entfernen der cursor mit for xml path ('') </strong></p><pre><code>select l.charactername +'|'+ l.val + (select stuff((select ','+quotename(attrval) from dbo.lotrattributes la where la.lotrid = l.lotrid for xml path('')), 1, 1, '')) from dbo.lotr l; </code></pre><h2>* *</h2><p>die eigentliche problemumgehung besteht darin, herauszufinden, warum die daten auf diese weise dargestellt werden, und die anwendung zu ändern, um sie nicht in diesem format zu benötigen, und sie irgendwo zu speichern.</p><p>wenn ihre hände gebunden sind, wäre dies das nächstbeste.</p><hr><h2>fügen sie die top-10-werte in eine temporäre tabelle ein, basierend auf den ids in einer anderen tabelle</h2><p><strong> daten </strong></p><p>create table dbo.sometable (inserttableid int, val varchar (255)); create table dbo.top10table (top10tableid int, inserttableid int, val varchar (255));</p><pre><code>insert into dbo.sometable(inserttableid,val) values(1,'bla') ,(2,'blabla'); insert into dbo.top10table(top10tableid,inserttableid,val) values(1,1,'wuw') ,(2,1,'wuw') ,(3,1,'wuw'); </code></pre><p><strong> cursor </strong></p><pre><code>create table #top10values(top10tableid int, inserttableid int, val varchar(255)) declare @inserttableid int; declare c cursor for select inserttableid from dbo.sometable; open c fetch next from c into @inserttableid; while @@fetch\_status =0 begin insert into #top10values(top10tableid,inserttableid,val) select top(10) top10tableid,inserttableid,val from dbo.top10table where inserttableid = @inserttableid order by top10tableid fetch next from c into @inserttableid; end close c deallocate c select * from #top10values; drop table #top10values; </code></pre><p><strong> ergebnis </strong></p><pre><code>top10tableid inserttableid val 1 1 wuw 2 1 wuw 3 1 wuw </code></pre><p><strong> ersetzen des cursors durch <code>cross apply</code> und ein <code>cte</code> </strong></p><pre><code>create table #top10values(top10tableid int, inserttableid int, val varchar(255)); ;with cte as ( select inserttableid from dbo.sometable ) insert into #top10values(top10tableid,inserttableid,val) select t1t.top10tableid,t1t.inserttableid,t1t.val from cte cross apply (select top (10) top10tableid,inserttableid,val from dbo.top10table t1t where t1t.inserttableid = cte.inserttableid ) t1t ; select * from #top10values; drop table #top10values; </code></pre><hr><h2>andere beispiele</h2><ul> <li>ein beispiel zum ersetzen eines cursors zur auswahl eines dynamischen satzes von artikeln pro lieferant mithilfe von <code>cross apply</code> <a href="https://dba.stackexchange.com/questions/100761/replacing-a-cursor-with-a-single-query-possible">hier</a> .</li> <li>ein beispiel für die verwendung von fensterfunktionen zum ersetzen eines cursors <a href="https://dba.stackexchange.com/questions/127083/improve-a-query-using-cursor-to-set-based-approach">hier</a> .</li> </ul><hr><p><strong> manchmal gibt es keine andere wahl </strong></p><p>wenn sie nicht in sätzen arbeiten können und zeilenweise arbeiten müssen, können sie den cursor trotzdem optimieren.</p><p>eine der größten änderungen bei der beschleunigung des cursors ist das hinzufügen von <code>local fast\_forward</code>.</p><pre><code>declare c cursor local fast\_forward for select lotrid from dbo.lotr </code></pre><p>schauen sie sich <a href="https://sqlperformance.com/2012/09/t-sql-queries/cursor-options">diesen blogpost</a> von @aaronbertrand an, wo er die möglichen leistungsunterschiede erklärt, wenn cursoreinstellungen wie <code>local</code> &amp; <code>fast\_forward</code> verwenden oder nicht.</p> Entweder durch 4 Regeln, wie von GF123 beschrieben, oder als Formel über:  

"Formel zur Ermittlung der zu formatierenden Zellen verwenden" und dann als Formel, für z.B. die Zelle A1:  

=ODER($A$1="a";$A$1="d";$A$1="g";$A$1="j")  

Klappt es? <p>der grund, warum sie denselben inhalt erhalten, liegt in der eigenschaft <code>#cache</code> des render-arrays, die sie beim aufrufen der methode <code>render()</code> erhalten.</p><p>insbesondere setzen sie durch aufrufen von <code>setoffset()</code> früher in ihrem code implizit einen cache-schlüssel für das render-array (siehe <a href="https://api.drupal.org/api/drupal/core%21modules%21views%21src%21viewexecutable.php/function/viewexecutable%3a%3asetoffset/8.2.x">hier</a> ):</p><blockquote> <pre><code>$this-&gt;element['#cache']['keys'][] = 'offset:' . $offset; </code></pre></blockquote><p>diese cache-schlüsseleinstellung in kombination mit der eigenschaft <code>#theme</code> des render-arrays (<code>views\_view</code>), die für beide ansichten gleich ist, führt beim einschließen zu einer zwischengespeicherten version der ersten die zweite, da die kombination [<code>#theme</code>] + [<code>#cache</code>] [schlüssel] für beide ansichten identisch ist.</p><p>um das zu umgehen, könnten sie:</p><ol> <li>entfernen sie das caching für diese ansichten vollständig, oder</li> <li>vermeiden sie die verwendung von <code>setoffset()</code> oder</li> <li> <p>fügen sie dem cache spezifischere schlüssel hinzu, sodass sie für jede ansicht einen anderen cache haben. z.b.</p> <pre><code>$variables['viewcalls']['#cache']['keys'] = array\_merge( $variables['viewcalls']['#cache']['keys'], array('viewcalls') ); ... $variables['viewappointments']['#cache']['keys'] = array\_merge( $variables['viewappointments']['#cache']['keys'], array('viewappointments') ); </code></pre></li> </ol><p>ich habe ihren fall mit der option 3. getestet und es hat wie erwartet funktioniert. bevor sie sich für die verwendung eines anderen moduls entschieden haben, können sie versuchen, an ihrem ursprünglichen code festzuhalten und die eigenschaft <code>#cache</code> beide render-arrays entsprechend zu ändern.</p><p>viel glück!</p> weiß nicht, obs klappt, Diagramme sind auch meine Stärke nicht, im Kopf schon gleich gar nicht, aber versuch doch mal, die x-Achse manuell fallend festzulegen, also nicht von zB min 0..max100, sondern von 100..0


Oder Du manipulierst die Werte: in A11: =max($A10:$E10)-A10, rüberziehen.  

(oder =100-A10). Wäre **alternativ** auch für y denkbar (nicht beides gleichzeitig!).
Auch -A10 könnte gehen, wenn Dich das negative Vorzeichen nicht stört. 


Dabei kannst Du vor E:E immer wieder eine Spalte einsetzen. das Diagramm übernimmt das aber nur vielleicht, wenn Du schreibst **"='Tabelle1'!$A$10:$E$10"** . Alle anderen Bezüge entsprechend. so wie gewünscht, geht das ganz einfach = wenn die seitenummer auf seite 3 beginnen soll, dann so= auf die seite 2 mit dem curser gehn- dann -einfügen-manueller umbruch-seitenumbruch-vorlage - erste seite - seitennummer ändern-1 setzen - bestätigen- fertig, nun kann man deckblatt usw. bearbeiten. so nun ist die seite drei die erste seite= einfügen - fußzeile -standard- ok. einfügen-feldbefehl-seitennummer - ok. fertig. das geht natürlich so auch nach dem selbensystem mit der kopfzeile. mfg.m. <p>damit text über den rand einer zelle hinaus überläuft, müssen die folgenden bedingungen erfüllt sein:</p><ul> <li>in der zelle ist &quot;wrap text&quot; nicht aktiviert</li> <li>die zelle ist keine zusammengeführte zelle</li> <li>die zelle enthält einen wert, der die breite der zelle überschreitet</li> <li>die angrenzende zelle ist leer * und keine zusammengeführte zelle</li> <li> <p>die zelle weist eine der folgenden horizontalen ausrichtungen auf:</p> <ul> <li>allgemeines</li> <li>links (einzug)</li> <li>center</li> <li>richtig (einzug)</li> <li>auswahl zentrieren<br> (rechts überlappt die zelle nach links; mitte überlappt auf beiden seiten.)</li> </ul> </li> <li> <p>der zelleninhalt wird nicht gedreht (d. h.<em> ausrichtung </em>ist auf 0 ° eingestellt) <sub>(nur excel 2010?)</sub></p> </li> <li>die zelle enthält einen textwert. zahlen- und datumswerte werden in <code></code> oder in wissenschaftliche notation konvertiert, anstatt benachbarte leere zellen zu überlappen.</li> <li>im arbeitsblatt ist &quot;formeln anzeigen&quot; nicht aktiviert</li> </ul><p>ich glaube, das sind alle notwendigen voraussetzungen. wenn ich etwas verpasst habe, können sie diese antwort gerne bearbeiten.</p><p><sub>*<em> unter bestimmten umständen kann eine benachbarte zelle leer sein </em>scheinen<em> aber nicht leer sein. in diesem fall fließt der text nicht in diese zelle über, da er nicht wirklich leer ist. </em></sub></p> <p>in späteren versionen von pandas ergibt dies einen typeerror:</p><pre><code>df.replace('-', none) typeerror: if "to\_replace" and "value" are both none then regex must be a mapping </code></pre><p>sie können dies tun, indem sie entweder eine liste oder ein wörterbuch übergeben:</p><pre><code>in [11]: df.replace('-', df.replace(['-'], [none]) # or .replace('-', {0: none}) out[11]: 0 0 none 1 3 2 2 3 5 4 1 5 -5 6 -1 7 none 8 9 </code></pre><p>ich empfehle jedoch die verwendung von nans anstelle von none:</p><pre><code>in [12]: df.replace('-', np.nan) out[12]: 0 0 nan 1 3 2 2 3 5 4 1 5 -5 6 -1 7 nan 8 9 </code></pre>