NACHZEILE vs. MAP
#1
Hallo zusammen,

bei Herber hatte ich gestern gepostet - bin aber noch nicht glücklich - daher auch nochmal hier:

=LET(x;SEQUENZ(65;;7);y;MAP(x;LAMBDA(a;UND(REST(a;SEQUENZ(a-2;;2)))));FILTER(x;y))

ermittelt zuverlässig die Primzahlen ab 7 bis (in diesem Fall) 71, also 7,11,13,17,19,23 usw. bis 71.

Die selbe Formel - nur mit NACHZEILE statt MAP - liefert (für mich überraschend) andere Ergebnisse - und zwar alle ungeraden Zahlen ab 7 bis 71 (und eben nicht nur die Primzahlen), also 7,9,11,13,15,17 usw. bis 71.

=LET(x;SEQUENZ(65;;7);y;NACHZEILE(x;LAMBDA(a;UND(REST(a;SEQUENZ(a-2;;2)))));FILTER(x;y))

Lagert man SEQUENZ(65;;7) jedoch in einen Zellbereich aus (im Beispiel in A2) und nimmt stattdessen auf den Spillbereich A2# Bezug, liefert auch NACHZEILE das gewünschte Ergebnis:

=LET(x;A2#;y;NACHZEILE(x;LAMBDA(a;UND(REST(a;SEQUENZ(a-2;;2)))));FILTER(x;y))

Kann mir jemand dieses NACHZEILE-Verhalten erklären?

P.S.: Es geht mir nicht um die Optimierung einer Primzahlformel oder irgendeine Variante, sondern ausschließlich um eine Erklärung für dieses NACHZEILE-Verhalten.
Antworten Top
#2
Ich häng noch die Beispieldatei mit an.


Angehängte Dateien
.xlsx   NACHZEILE_MAP.xlsx (Größe: 16,37 KB / Downloads: 7)
Antworten Top
#3
Hallo Boris,

ich bin in gewisser Weise in einer ganz anderen Richtung überrascht:

Ich dachte bisher, dass die beiden Funktionen UND(...) bzw. ODER(...) mit Arrays als Argumente nichts anfangen können. Und plötzlich scheint UND(...) in diesem MAP-Kontext doch array-freundlich zu sein.

Dass diese neue Freundschaft doch nicht zu weit geht, sieht man dann offenbar im NACHZEILE-Kontext, wo nur der REST(...,2)-Test (also die 1. UND-Bedingung) korrekt abgewickelt wird.
Bei der zweiten NACHZEILE-Variante handelt es sich nicht um ein Array, sondern um Zellbezüge (Zellbereich).

Oder ist es vielleicht so, dass MAP seinen Array-Parameter in einen "Quasi-Zellbezug" umwandelt, sodass deshalb das Ganze funktioniert. Aber das sind nur meine Phantastereien. Am ehesten würde das alles nur Microsoft beantworten können.
Mit lieben Grüßen
Anton.

Windows 10 64bit
Office365 32bit
Antworten Top
#4
Hi Anton,

dank erst einmal für Deine Überlegungen!  Thumps_up

MAP und NACHZEILE zerlegen ja ein Array (oder einen Bereich) zeilenweise. Die UND-Funktion kumuliert dann die einzelnen Zeilen und wird (durch LAMBDA) dann als vertikales Array (aller einzelnen kumulierten Zeilen) zurückgegeben - und diesem Fall bestehend aus WAHR und FALSCH, indem sie zeilenweise die RESTe (Nullen und Zahlen größer/gleich 1) kumuliert und nur bei durchgängig Zahlen größer Null WAHR zurückgibt.
Somit kann ich die Funktionsweise von UND hier gut nachvollziehen.

Zum Thema Array vs. Bezug:
Hier scheint ja der Hase im Pfeffer zu liegen, da NACHZEILE in diesem Fall mit dem Bezug funktioniert. In der Hilfe steht jedoch nichts davon, dass NACHZEILE zwingend einen Bezug benötigt.
Als kleiner Dummy-Beweis dafür, dass NACHZEILE sehr wohl mit auch mit Arrays kann:

=LET(x;SEQUENZ(5;4);NACHZEILE(x;SUMME))
bzw. in der "Alt-Version"
=LET(x;SEQUENZ(5;4);NACHZEILE(x;LAMBDA(a;SUMME(a))))

funktioniert einwandfrei - und hier erhält NACHZEILE auch keinen Bezug sondern ein SEQUENZ-Array.

Bleibt (für mich) derzeit also nur noch die Funktion REST im Verdacht, hier irgendwie "zu zicken" - kann es mir aber ehrlich gesagt nicht erklären, weshalb es so sein sollte.

Mal sehen - vielleicht hat ja noch jemand anderes irgendeine Idee dazu - und sei es auch nur die Bestätigung, dass die Funktion diesbezüglich noch etwas "unausgegoren" sein sollte Wink

Hier hab ich es nochmal veranschaulicht.

A2:
=SEQUENZ(65;;7)

In B2 steht nur:

=UND(C2#)

(und runterkopiert).

C2:
=MTRANS(REST(A2;SEQUENZ(A2-2;;2)))

ebenfalls runterkopiert.

Das ist ja (nach meinem Verständnis) die Funktionsweise von NACHZEILE, indem diese ganze Matrix innerhalb der Formel erzeugt und am Ende nur die kumulierte Spalte B zurückgegeben wird (die dann in meiner Ursprungsformel für den Parameter 'einschließen' der FILTERfunktion dient).

Aber warum das in meinem konkreten Fall nur mit einem Bezug funktioniert, erschließt sich mir einfach nicht.


Angehängte Dateien Thumbnail(s)
   
Antworten Top
#5
Bei Herber kam grad noch ein guter Input von Onur, obwohl ich ihn nur bedingt verstehe:

=LET(x;SEQUENZ(65;;7);y;NACHZEILE(x;LAMBDA(a;UND(REST(a;SEQUENZ(@a-2;;2)))));FILTER(x;y))

Also das hinzugefügte @ (wie in intelligenten Tabellen) führt in der Tat dazu, dass die Formel die korrekten Ergebnisse (Primzahlen) liefert.

Seine Mutmaßung / Erläuterung dazu:

NACHZEILE übergibt, im Gegensatz zu MAP, das ganze Array auf einmal an das Lambda. Das @ zwingt NACHZEILE dazu, nur einzelne Werte zu übergeben.

kann ich so aber nicht unterschreiben, denn die zeilenweise Übergabe der Werte ist ja mMn die Kernfunktion von NACHZEILE bzw. LAMBDA nimmt diese (automatisch) zeilenweise auf.

Aber vielleicht hilft Euch das bei möglichen Erklärungsversuchen!
Antworten Top
#6
Dieser Link behandelt das selbe Thema: https://techcommunity.microsoft.com/disc...ow/3777828

Dann scheint es vielleicht doch so zu sein, wie von Onur geschrieben.
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste