AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79200844
Accepted
AReubens
AReubens
Asked: 2024-11-19 01:22:30 +0800 CST2024-11-19 01:22:30 +0800 CST 2024-11-19 01:22:30 +0800 CST

Ladrilhando uma matriz do Excel em 2 dimensões, de preferência sem usar VBA

  • 772

Estou tentando dividir uma matriz do Excel em duas dimensões, conforme definido por outra matriz, de preferência sem usar VBA.

Para explicar melhor, o que eu gostaria é de uma fórmula do Excel paraf(A, B)

Onde A é booleano e =

[[1, 0],
 [0, 1]

Onde B =

[[1, 2],
 [3, 4]

E f(A, B)os tiles B de acordo com os valores bool em A, neste caso,f(A, B) =

[[1, 2, 0, 0],
 [3, 4, 0, 0],
 [0, 0, 1, 2],
 [0, 0, 3, 4]]

Meus pensamentos iniciais foram, =IF(MUNIT(2), {1, 2;3, 4}, {0, 0;0, 0})mas a saída não se expande bem.

excel
  • 5 5 respostas
  • 160 Views

5 respostas

  • Voted
  1. Best Answer
    Tom Sharpe
    2024-11-19T02:09:40+08:002024-11-19T02:09:40+08:00

    Este é meu esforço até agora - espero que seja bastante geral:

    =LET(A,A1:B2,B,D1:E2,DROP(REDUCE(SEQUENCE(1,COLUMNS(A)*COLUMNS(B)),SEQUENCE(ROWS(A)),LAMBDA(rowAcc,row,VSTACK(rowAcc,
       DROP(REDUCE(SEQUENCE(ROWS(B)),SEQUENCE(1,COLUMNS(A)),LAMBDA(colAcc,col,HSTACK(colAcc,B*INDEX(A,row,col)))),,1)))),1))
    

    insira a descrição da imagem aqui


    Você também pode usar Makearray:

    =LET(A,A1:B2,B,D1:E2,rA,ROWS(A),rB,ROWS(B),cA,COLUMNS(A),cB,COLUMNS(B),
    MAKEARRAY(rA*rB,cA*cB,LAMBDA(r,c,INDEX(A,(r-1)/rB+1,(c-1)/cB+1)*INDEX(B,MOD(r-1,rB)+1,MOD(c-1,cB)+1))))
    

    (Mesma lógica da versão legada de @Scott Craner)

    • 6
  2. Scott Craner
    2024-11-19T06:01:17+08:002024-11-19T06:01:17+08:00

    Abordagem semelhante à do Tom, mas um pouco mais curta:

    =LET(
        _t,A1:B2,
        _a,D1:E2,
        DROP(REDUCE("",SEQUENCE(ROWS(_t)),LAMBDA(_y,_z,VSTACK(_y,
            DROP(REDUCE("",CHOOSEROWS(_t,_z),LAMBDA(_x,_w,HSTACK(_x,
                IF(_w=1,_a,SEQUENCE(ROWS(_a),COLUMNS(_a),0,0))))),,1)))),1))
    

    insira a descrição da imagem aqui


    E só por diversão, isso funcionará em versões mais antigas:

    =IFERROR(
        IF(INDEX($A$1:$B$2,INT((ROW($A1)-1)/ROWS($D$1:$E$2))+1,INT((COLUMN(A$1)-1)/COLUMNS($D$1:$E$2))+1)=0,
            0,
            INDEX($D$1:$E$2,MOD((ROW($A1)-1),ROWS($D$1:$E$2))+1,MOD((COLUMN(A$1)-1),COLUMNS($D$1:$E$2))+1))
        ,"")
    

    Arraste-o para cima e para baixo o suficiente para o tamanho da matriz.

    insira a descrição da imagem aqui

    • 5
  3. DjC
    2024-11-19T10:59:27+08:002024-11-19T10:59:27+08:00

    Para retornar o produto de Kronecker de duas matrizes, tente o seguinte código Python:

    a = xl("A1:B2")
    b = xl("D1:E2")
    
    np.kron(a,b)
    

    py_kronecker_produto.png

    Se você nunca usou Python no Excel antes, consulte: Comece a usar Python no Excel

    Método alternativo 1:

    Para melhor desempenho em matrizes maiores, você também pode tentar usar bissecção:

    =LET(a,A1:C100,b,E1:I1000,BiROW(a,LAMBDA(r,BiCOL(r,LAMBDA(c,c*b)))))
    

    Onde BiCOLe BiROWsão funções lambda personalizadas definidas no Gerenciador de Nomes:

    BiCOL:
    =LAMBDA(array,function,IF(COLUMNS(array)=1,function(array),LET(n,QUOTIENT(COLUMNS(array),2),HSTACK(BiCOL(TAKE(array,,n),function),BiCOL(DROP(array,,n),function)))))
    
    BiROW:
    =LAMBDA(array,function,IF(ROWS(array)=1,function(array),LET(n,QUOTIENT(ROWS(array),2),VSTACK(BiROW(TAKE(array,n),function),BiROW(DROP(array,n),function)))))
    

    Método alternativo 2:

    Se você preferir usar uma REDUCE-VSTACK/HSTACKabordagem, o desempenho também pode ser melhorado empilhando os resultados em pares, em vez do empilhamento linear:

    =LET(
        a, A1:C100, b, E1:I1000,
        kpλ, MAP(a,LAMBDA(n,LET(m,n*b,LAMBDA(m)))),
        i, SEQUENCE(CEILING.MATH(LOG(ROWS(kpλ),2),1)),
        j, SEQUENCE(CEILING.MATH(LOG(COLUMNS(kpλ),2),1)),
        λ, LAMBDA(fx,LAMBDA(l,k,LET(w,WRAPROWS(l,2),MAP(TAKE(w,,1),DROP(w,,1),LAMBDA(x,y,LET(z,IF(TYPE(y)=16,x(),fx(x(),y())),LAMBDA(z))))))),
        join_x, BYROW(kpλ,LAMBDA(r,REDUCE(r,j,λ(HSTACK)))),
        join_y, INDEX(REDUCE(join_x,i,λ(VSTACK)),1),
        join_y()
    )
    

    Para uma versão generalizada deste método, consulte MAPλa função de Peter Bartholomew: https://gist.github.com/pbartxl

    Método alternativo 3:

    Outra opção relativamente eficiente é usar TOCOLwith SORTBYe WRAPROWS; no entanto, esse método só pode gerar um máximo de 1.048.576 elementos totais, devido às limitações de TOCOL:

    =LET(
        a, A1:D128, b, F1:M256,
        v, TOCOL(a)*TOROW(b),
        λ, LAMBDA(x,fx,TOCOL(IF({1},fx(IF({1},SEQUENCE(ROWS(x)),x)),v))),
        WRAPROWS(SORTBY(TOCOL(v),λ(a,TOCOL),1,λ(b,TOROW),1),COLUMNS(a)*COLUMNS(b))
    )
    
    • 5
  4. P.b
    2024-11-19T14:54:07+08:002024-11-19T14:54:07+08:00

    Esta seria minha abordagem no Office 365: =LET(f,LAMBDA(a,b,DROP(REDUCE("",SEQUENCE(COLUMNS(a)),LAMBDA(c,d,HSTACK(c,REDUCE("",SEQUENCE(ROWS(a)),LAMBDA(e,f,VSTACK(e,b*INDEX(a,f,d))))))),1,1)),f(B1:D3,F1#))

    Editar: Olhando para a resposta de Tom Sharpe, a minha é meio parecida. Usei o DROP no todo, em vez das funções REDUCE individuais e o envolvi em LAMBDA para chamar fcomo no post de abertura. Mas, fora isso, não é muito diferente, então se você votar, pelo menos vote também no Tom's

    insira a descrição da imagem aqui

    • 0
  5. nkalvi
    2024-11-20T02:41:05+08:002024-11-20T02:41:05+08:00

    Nenhuma lógica nova, reduzindo sem DROPe usando INDEX, esperando por melhor desempenho:

    =LAMBDA(a, b,
        LET(
            cols_a, SEQUENCE(, COLUMNS(a) - 1, 2),
            h_stack, LAMBDA(row,
                REDUCE(
                    INDEX(a, row, 1) * b,
                    INDEX(a, row, cols_a),
                    LAMBDA(acc, a, HSTACK(acc, a * b))
                )
            ),
            REDUCE(
                h_stack(1),
                SEQUENCE(ROWS(a) - 1, , 2),
                LAMBDA(acc, row, VSTACK(acc, h_stack(row)))
            )
        )
    )(Sheet2!A1:D128, Sheet2!F1:M256)
    

    Demorou cerca de 6 segundos com esses intervalos no meu Mac.

    • 0

relate perguntas

  • Como posso retornar linhas específicas onde EXISTE uma taxa no contrato listado, mas NÃO há taxa no sistema?

  • adicionar automaticamente um campo de referência em uma tabela quando alguns valores são repetidos?

  • percorrer a coluna com a alteração do endereço da célula

  • Pesquise uma string e os valores de saída correspondentes a essa string

  • Existe uma maneira no Excel de contar as ocorrências de um texto específico em uma string, mas também incluir o caractere anterior?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve